심벌이란?

심벌 값의 생성

Symbol 함수

// Symbol 함수를 호출하여 유일무이한 심벌 값을 생성한다.
const mySymbol = Symbol();
console.log(typeof mySymbol); // symbol

// 심벌 값은 외부로 노출되지 않아 확인할 수 없다.
console.log(mySymbol); // Symbol()

// new 연산자를 사용해서 호출하지 않는다.
new Symbol(); // typeError: Symbol is not a constructor

// 심벌 값에 대한 설명이 같더라도 유일무이한 심벌 값을 생성한다.
const mySymbol1 = Symbo('mySymbol');
const mySymbol2 = Symbo('mySymbol');

console.log(mySymbol1 === mySymbol2); // false

// 심벌도 래퍼 객체를 생성한다.
const mySymbol3 = Symbol('mySymbol');

console.log(mySymbol3.description); // mySymbol
console.log(mySymbol3.toString()); // Symbol(mySymbol)

// 심벌 값은 암묵적으로 문자열이나 숫자 타입으로 변환되지 않는다.
// 불리언 타입으로는 암묵적으로 타입 변환된다.
const mySymbol4 = Symbol();

console.log(mySymbol4 + ''); // TypeError: Cannot conver a Symbol value to a string
console.log(+mySymbol4); // TypeError: Cannot conver a Symbol value to a number
console.log(!!mySymbol4); // true

if(mySymbol) console.log('mySymbol is not empty.');

Symbol.for / Symbol.keyFor 메서드

// 전역 심벌 레지스트리에 mySymbol 이라는 키로 저장된 심벌 값이 없으면 새로운 심벌 값을 생성
const s1 = Symbol.for('mySymbol');
// 전역 심벌 레지스트리에 mySymbol 이라는 키로 저장된 심벌 값이 있으면 해당 심벌 값을 반환
const s2 = Symbol.for('mySymbol');

console.log(s1 === s2); // true

// 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출
Symbol.keyFor(s1); // mySymbol

// Symbol 함수를 호출하여 생성한 심벌 값은 전역 심벌 레지스트리에 등록되어 관리되지 않는다.
const s3 = Symbol('foo');
// 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출
Symbol.keyFor(s3); // undefined

심벌과 상수