자바스크립트는 문자열, 숫자, 불리언, undefined, null, 객체의 타입이 있었지만 ES6에서 Symbol 이라는 변경 불가능한 원시 타입의 값이 추가되었다. new 연산자 없이 함수를 호출해서 선언하며, 유일무이한 값을 가진다.
const mySymbol = Symbol();
console.log(typeof mySymbol, mySymbol); // symbol, Symbol()
const mySymbol1 = Symbol('mySymbol');
const mySymbol2 = Symbol('mySymbol');
console.log(mySymbol1 === mySymbol2); //false
console.log(mySymbol1.description,typeof mySymbol1.toString()); //mySymbol, string
Symbol 값은 불리언 값을 제외하고는 암묵적 타입 변환이 일어나지 않는다.
그리고 Symbol.for 메서드를 사용하여 키와 심벌 값의 쌍이 저장된 전역 심벌 레지스트리에서 값을 검색할 수 있다. Symbol.keyFor은 심벌 값의 키를 추출한다.
const s1 = Symbol.for('mySymbol');// mySymbol 키로 저장된 값이 없다면 생성
const s2 = Symbol.for('mySymbol');// 있다면 반환
console.log(s1 === s2); // true
Symbol.keyFor(s1); //mySymbol, Symbol 함수 호출로 생성한 값은 레지스트리에 등록되지 않으므로 undefined
그리고 객체의 프로퍼티 키에 심벌 값을 할당할 수 있고, 그 값은 for ... in 이나 Object.keys, getOwnPropertyNames 메서드로 찾을 수 없으므로 은닉이 가능하다.
const obj = {
[Symbol.for('mySymbol')]:1
};
obj[Symbol.for('mySymbol')]; // 1
console.log(Object.keys(obj)); // []