반응형
33 Symbol
이름충돌 없는 유일한 프로퍼티 키를 만들기 위해 사용함
Symbol함수
new와 함께 사용하지 않음
접근시 암묵적으로 래퍼 객체를 만듦
description, toString
const mySymbol=Symbol("mysymbol");
console.log(mySymbol.description); //mysymbol
심벌값은 암묵적으로 문자열이나 숫자타입으로 변환되지 않는다.
단, 불리언으로는 변환된다.
Symbol.for/Symbol.keyFor
인수로 전달받은 문자열을 키로 사용하여 키와 심벌값들의 쌍이 저장되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌값을 검색함
검색 실패시 전역 심벌 레지스트리에새로 생성하여 반환한다.
const s1=Symbol.for('mySymbol');
const s2=Symbol.for('mySymbol');
s1===s2; //true
Symbol.keyFor
전역 심벌 레지스트리에 저장된 심벌값의 키를 추출 가능함
cosnt s1=Symbol.for('mySymbol');
Symbol.keyFor(s1); //mySymbol
const s2=Symbol('foo');
Symbol.keyFor(s2); //undefined
심벌과 프로퍼티 키
객체의 프로퍼티 키로 심벌을 사용할 수 있다.
const obj={
[Symbol.for('mySymbol')]:1
}
심벌은 유일무의하므로, 다른 프로퍼티 키와 절대로 충돌하지 않는다.
심벌과 프로퍼티 은닉
심벌값으로 만든 프로퍼티는
for in, Object.keys, getOwnPropertyNames로도 찾을 수 없다.
즉, 외부에 노출되지 않는다.
하지만, getOwnPropertySymbols를 사용하면 찾을 수 있다.
표준 빌트인 객체 확장
표준 빌트인 객체를 확장할 때, 심벌을 사용하면 미래의 프로퍼티와도 충돌하지 않아 미래에 발생할 수 있는 문제를 미연에 방지할 수 있다.
well-known Symbol
js가 기본적으로 제공하는 빌트인 심벌값을 ECMAScript에서는 well-known symbol이라 부른다.
예시로 Symbol.iterator가 있다. 해당 키를 프로퍼티로 갖게되면, 해당 객체는 이터러블이 된다.
const iterable={
[Symbol.iterator](){
let cur:1;
const max:5;
return {
next(){
return value:cur++, done:cur>max+1;
}
}
}
}
for (const num of iterable){
console.log(num);
}
반응형