작성자 : 배광식
검수자 : 장기효, 배광식
Symbol
- ES6에서 새롭게 추가
- 애플리케이션에서 유일한 값
- 변경 불가능 (immutable)
- 기본 자료형 (primitive)
- 주로 객체의 속성 key로 사용
기존 자바스트립트의 6가지 타입
기본 자료형 (primitive data type)
- Boolean
- null
- undefined
- Number
- String
객체형 (Object type)
- Object
기본문법
생성
Symbol() 함수를 통해 생성하며 이때 생성된 Symbol은 값이다.
아래 secondSymbol처럼 디버깅 용도로 Symbol() 함수 인자에 문자열 (description)을 사용할 수 있다.
const firstSymbol = Symbol();
const secondSymbol = Symbol('description');
console.log(firstSymbol); // Symbol()
console.log(typeof firstSymbol); // symbol
console.log(secondSymbol); // Symbol(description)
console.log(typeof secondSymbol); // symbol
생성한 Symbol은 애플리케이션에서 유일한 값이다.
const firstSymbol = Symbol('description');
const secondSymbol = Symbol('description');
console.log(firstSymbol === secondSymbol); // false
사용
Symbol 값은 다른 값들과 구분되는 유일한 값이기 때문에 보통 속성 key로 사용한다.
const obj = {};
const firstSymbol = Symbol();
const secondSymbol = Symbol('second');
obj[firstSymbol] = 1;
obj[secondSymbol] = 2;
console.log(obj); // { [Symbol()]: 1, [Symbol(second)]: 2 }
console.log(firstSymbol in obj); // true
console.log(obj[firstSymbol]); // 1
console.log(obj[secondSymbol]); // 2
지원하는 API
Symbol.for
Symbol.for의 인자로 전달받은 문자열 first를 Symbol 레지스트리에서 검색하여 있다면 해당 Symbol을 반환하고 없으면 새로운 Symbol을 생성한다. (여러 모듈에서 Symbol을 공유해야 하는 경우 사용할 수 있다.)
// 'first' 검색결과 없음 : 새로운 Symbol 생성
const firstSymbol = Symbol.for('first');
console.log(firstSymbol); // Symbol(first)
// 'first' 검색결과 있음 : 검색 된 Symbol 반환
const secondSymbol = Symbol.for('first');
console.log(secondSymbol); // Symbol(first)
console.log(firstSymbol === secondSymbol); // true
Symbol.keyFor
인자로 전달받는 Symbol을 통해 Symbol의 key를 반환한다. (Symbol.for()에 의해서 생성된 경우)
const firstSymbol = Symbol.for('first');
console.log(Symbol.keyFor(firstSymbol)); // first
const secondSymbol = Symbol('second');
console.log(Symbol.keyFor(secondSymbol)); // undefined
Well-Known Symbol
자바스크립트 엔진에 상수로 존재, 자바스크립트 엔진은 Well-Known Symbol를 참조하여 일정한 처리를 한다.
Symbol.iterator
객체가 Symbol.iterator를 property key로 사용한 메소드를 가지고 있으면 자바스크립트 엔진은 이 객체가 iteratoration protocol을 따르는 객체로 간주하고 iterator로 동작하도록 한다. 또한 이 객체를 iterable한 객체라 한다.