TIL 20211001

e·2021년 10월 1일
0

TIL : js

목록 보기
4/7
post-thumbnail

옵셔널 체이닝optional chaining

Optional chaining

옵셔널 체이닝 연사자 ?. 은 프로퍼티가 없는 중첩 객체를 에러없이
안전하게 접근할 수 있다.

?. 앞의 평가 대상이 undefined 거나 null 이면 평가를 멈추고
undefined를 반환함. nullish한 값..

let user = null;

aler(user?.address); // undefined
alert(user?.address.street); // undefined

?. 앞의 변수는 꼭 선언되어 있어야함.

delete user?.name; // user 가 존재하면 user.name 을 삭제

?. 는 왼쪽 평가대상에 값이 없으면 즉시 평가를 멈춤 => 단락평가short-circuit 라고 함.
?. 은 읽기나 삭제하기가 가능하지만 쓰기는 할수 없다.

...

심볼형

심볼은 원시형 데이터!!!!

자바스크립트는 객체 프로퍼티 키로 오직 문자형과 심볼형만 허용.
숫자형, 불린형

'심볼symbol'은 유일한 식별자unique identifier 를 만들고 싶을 때 사용.

// id는 새로운 심볼이 됨
let id = Symbol();
// "id"라는 설명을 붙임
let id = Symbol("id");

심볼은 유일성이 보장되는 자료형. 설명이 동일해도 각 심볼값은 다름.
설명은 어떤것에도 영향을 주지 않는 이름표 역할만.

심볼은 문자형으로 자동 형 변환되지 않음.
비교적 암시적형 변환이 자유롭게 일어나는 자바스크립트!

symbols in a literal
객체 리터럴 {...}을 사용해 객체를 만든 경우,
대괄호를 사용해 심볼형 키를 만들어야함

let id = Symbol("id");

let user= {
	name : "9ing",
    [id] : 999 // "id" : 999 는 안됨..
};

심볼은 for...in 에서 배제됨

let id = Symbol("id");
let user = {
	name : 9ing,
    age : 80,
    [id] : 999
};

for (let key in user) alert(key); // name과 age는 출력되나 id는 건너뜀

// 심볼로 직접 접근하면 잘 작동함
alert(user[id]); // 999

심볼형 프로퍼티 숨기기 hiding symbolic property 원칙
외부스크립트나 라이브러리는 심볼형 키를 가진 프로퍼티에 접근하지 못함

그러나... Object.assign 은 키가 심볼인 프로퍼티 배제않고
객체 내 모든 프로퍼티를 복사함.

전역심볼?
전역 심볼 레지스트리global symbolregistry
이름이 같은 경우 항상 동일한 심볼을 반환해줌..

Symbol.for(key)
이 메서드를 호출하면 이름이 key인 심볼을 반환..
조건에 맞는 심볼이 레지스트리 안에 없으면 새로운 심볼 Symbol(key)만들고
레지스트리 안에 저장.
전역 심볼 레지스트리 안에 있는 심볼 은 전역심볼 이라 부름.

Symbol.keyFor(sym)를 사용하면
심볼을 이용해 이름을 얻을 수 있음.
이 경우 전역 심볼이 아닌 인자가 넘어오면 Symbol.keyFor는 undefined를 반환함.
일반 심볼에서 이름을 얻고 싶으면 description 프로퍼티를 사용하면 됨.

시스템 심볼system symbol 은 자바스크립트 내부에서 사용되는 심볼..
시스템 심볼을 활용하면 객체를 미세 조정할 수 있다.

객체가 어떻게 원시형으로 변환되는지 알기 위해선 Symbol.toPromitive에 대해
알아야 하는데.... 아이고 머리야

객체를 원시형으로 변환하기

  1. 객체는 논리평가 시 true 를 반환.
    따라서 객체는 숫자형이나 문자형으로만 형 변환이 일어남

  2. 숫자형으로의 형 변환은 객체끼리 빼는 연산을 할 때나
    수학 관련 함수를 적용할 때 일어남.
    (date1 - date2) 객체 data끼리 차감 하면......

  3. 문자형으로의 형 변환은 대개 alert(obj) 같이 객체를 출력하려고 할 때..

ToPrimitive
특수 객체 메서드를 사용하면.. 숫자형, 문자형으로의 형 변환을 원하는대로..
"string" (alert 같이 문자열을 필요로 하는 연산)
"number" (수학 연산)
"default" (드물게 발생함)ㄹ
"boolean"은 없음. 주의!

Symbol.toPrimitive
자바스크립트엔 Symbol.toprimitive라는 내장 심볼이 존재하는데,
이 심볼은 목표로하는 자료형hint을 명명하는 데 사용됨.

toString과 valueOf
toString과 valueOf는 심볼이 생기기이전부터 존재해왔던 메서드
구식이긴하지만 형 변환을 직접 구현할 수 있다.

반환 타입
확신할 수 있는 단 한가지는 객체가 아닌 원시값을 반환해 준다는 것 뿐.
toString이나 valueOf가 객체를 반환해도 에러가 발생하지 않지만 반환값이 무시되고 메서드가 존재않는 것처럼 동작.. 반면에 Symbol.toprimitive는
무조건 원시자료를 반환해야함. 그렇지않음 에러남..

추가 형 변환
곱셈 연산자 *는 피연산자를 숫자형으로 변환시킴..

profile
🌱 무럭무럭 자라자

0개의 댓글