1. 자바스크립트 타입

자바스크립트 기본 타입에는 원시 타입, 객체 타입이 존재하며 Boolean, null, undefined, Number, String까지 원시 타입, Object는 객체 타입이다. 여기서 Symbol은 자바스크립트에서 새로 추가된 원시 타입이다.

심볼은 고유함이 보장되는 타입이며, 변경 불가능하고, 이름의 충돌 위험이 없는 유일한 객체의 property key를 만들기 위해 사용된다.


2. 심볼 생성

2-1. Symbol()

let sym1 = Symbol('pjh');
let sym2 = Symbol('pjh');
let sym3 = Symbol();

console.log(sym1); // Symbol(pjh)
console.log(sym2); // Symbol(pjh)
console.log(sym3); // Symbol()
console.log(sym1 === sym2); // false

위처럼 심볼을 생성할 수 있으며, 이때 생성되는 심볼은 객체 타입이 아니라, 변경 불가능한 원시 타입이다. 고유함이 보장된다고 했는데, 유일성이 있는 자료형이기 때문에 sym1과 sym2의 값을 비교했을 때 다른 값이라고 나오게 된다. 심볼을 생성할 때 넣은 값은 별다른 뜻은 없고 주석(이름표) 같은 개념이라고 한다.

2-2. Symbol.for()

전역으로 사용 가능한 심볼을 생성해준다. Global Symbol Table의 목록을 참조하여, 전역으로 등록된 심볼 값을 가져올 수 있도록 한다.(주석이 붙은 심볼만 가능) 프로그램이 종료될 때까지 남아있다.

// 전역 Symbol 레지스트리에 foo라는 키로 저장된 Symbol이 없으면 새로운 Symbol 생성
const s1 = Symbol.for('foo');

// 전역 Symbol 레지스트리에 foo라는 키로 저장된 Symbol이 있으면 해당 Symbol을 반환
const s2 = Symbol.for('foo');

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

3. 심볼 사용

Object 타입의 property로 등록 가능. 또는 고유하다는 특성을 사용한 어떤 토큰 값을 만들때 사용.

const obj = {};

const sym1 = Symbol('a');
const sym2 = Symbol('a');

obj['a'] = 1;
obj[123] = 2;
obj[sym1] = 'symbol 1';
obj[sym2] = 'symbol 2';

console.log(obj);
/**
{
	'123': 2,
	a: 1,
	[Symbol(a)]: 'symbol 1',
	[Symbol(a)]: 'symbol 2'
}
*/

console.log(obj[sym1]); // symbol 1
console.log(obj[sym2]); // symbol 2