자바스크립트 기본 타입에는 원시 타입, 객체 타입이 존재하며 Boolean
, null
, undefined
, Number
, String
까지 원시 타입, Object
는 객체 타입이다. 여기서 Symbol
은 자바스크립트에서 새로 추가된 원시 타입이다.
심볼은 고유함이 보장되는 타입이며, 변경 불가능하고, 이름의 충돌 위험이 없는 유일한 객체의 property key를 만들기 위해 사용된다.
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의 값을 비교했을 때 다른 값이라고 나오게 된다. 심볼을 생성할 때 넣은 값은 별다른 뜻은 없고 주석(이름표) 같은 개념이라고 한다.
전역으로 사용 가능한 심볼을 생성해준다. 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
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