Symbol
● 기본 자료형 : Boolean, null, undefined, Number, String● 객체형 : Object
Symbol은 ES6에서 새롭게 추가된 7번째 타입이라고 할 수 있다.
Symbol은 애플리케이션 전체에서 유일하며 변경 불가능한 기본 자료형 값이며 주로 객체의 프로퍼티 키로 사용한다.
#1 Symbol 생성
let mySymbol = Symbol();
console.log(mySymbol); // Symbol()
console.log(typeof mySymbol); // symbol
Symbol() 함수는 String(), Number(), Boolean()과 같이 래퍼 객체를 생성하는 생성자 함수와는 달리 new 키워드를 사용하지 않는다.
new Symbol(); // TypeError: Symbol is not constructor
또한 Symbol은 위에서 말했듯이 변경 불가능한 기본 자료형이다.
let mySymbol = Symbol();
console.log(mySymbol + 's'); // TypeError: Cannot convert a Symbol value to a string
Symbol() 함수는 인자로 문자열을 전달할 수 있으며 이 문자열은 Symbol 생성에 어떠한 영향도 주지 않는다.
다만, 생성된 Symbol에 대한 설명(description)으로 디버깅 용도로만 사용된다.
let symbolWithDesc = Symbol('world');
console.log(symbolWithDesc); // Symbol(world)
console.log(typeof symbolWithDesc); // symbol
Symbol() 함수가 생성한 Symbol 값은 애플리케이션 전체에서 유일하다.
let mySymbol = Symbol('world');
console.log(mySymbol === Symbol('world')); // false
#2 Symbol 사용
const obj = {};
obj.prop = 'myProp';
obj[123] = 123; // N6 : obj.123 = 123;
obj['prop' + 123] = false;
console.log(obj); // { '123': 123, prop: 'myProp', prop123: false }
Symbol 값도 객체의 프로퍼티로 사용할 수 있다고 언급 했다.
Symbol 값은 애플리케이션 전체에서 유일한 값이므로 Symbol 값을 키로 갖는 프로퍼티는 다른 어떠한 프로퍼티와도 충돌하지 않는다.
const obj = {};
const mySymbol = Symbol('mySymbol');
obj[mySymbol] = 123;
console.log(obj); // { [Symbol(mySymbol)]: 123 }
console.log(obj[mySymbol]); // 123
#3 Symbol 객체
위 참조 결과에서 알 수 있듯이 Symbol 객체는 프로퍼티와 메소드를 갖고 있다.
Symbol 객체의 프로퍼티 중 length와 prototype을 제외한 프로퍼티를 'Well-Known Symbol'이라 부른다.
[ Symbol.iterator ]
< Symbol.iterator를 프로퍼티 키로 사용하여 메소드를 구현하고 있는 빌트인 객체(이터러블) >
* Array : Array.prototype[Symbol.iterator]
* String : String,prototype[Symbol.iterator]
* Map : Map.prototype[Symbol.iterator]
* Set : Set.prototype[Symbol.iterator]
* DOM data structures : NodeList.prototype[Symbol.iterator]
HTMLCollection.prototype[Symbol.iterator]
* arguments : arguments[Symbol.iterator]
[ Symbol.for ]
Symbol.for 메소드는 인자로 전달받은 프로퍼티 키를 통해 Symbol 레지스트리(Symbol 들의 리스트)에 존재하는 Symbol을 검색한다.
검색에 성공하면 Symbol을 반환하고, 실패하면 새로운 Symbol을 생성한다.
// 새로운 전역 Symbol 생성
const s1 = Symbol.for('lee');
// Symbol 레지스트리에서 이미 만들어진 Symbol 검색
const s2 = Symbol.for('lee');
console.log(s1 === s2); // true
Symbol() 함수는 매번 다른 Symbol 값을 생성하는 것에 반해, Symbol.for는 단 하나의 Symbol을 생성하여 여러 모듈이 공유한다.
'ECMAScript 6' 카테고리의 다른 글
모듈 (0) | 2019.08.22 |
---|---|
제너레이터 (0) | 2019.08.21 |
이터레이션 프로토콜 & for-of 루프 (0) | 2019.08.19 |
프로미스 (0) | 2019.08.18 |
클래스 -2 (0) | 2019.08.17 |