Symbol은 고유하고 불변인 원시 값입니다. 생성하는 모든 Symbol()은 고유함이 보장됩니다 — 같은 설명을 가진 둘조차도 같지 않습니다. 이들의 주된 역할은 충돌하지 않는(collision-proof) 객체 키가 되는 것입니다.
js
const id = Symbol();
id2 = ();
id === id2;
user = { [id]: , : };
user[id];
Symbol은 고유하고 불변인 원시 값입니다. 생성하는 모든 Symbol()은 고유함이 보장됩니다 — 같은 설명을 가진 둘조차도 같지 않습니다. 이들의 주된 역할은 충돌하지 않는(collision-proof) 객체 키가 되는 것입니다.
const id = Symbol();
id2 = ();
id === id2;
user = { [id]: , : };
user[id];
Symbol 키 속성은 문자열 키와 충돌하지 않으며 일반 열거에서 숨겨집니다 — 객체를 오염시키지 않고 메타데이터를 붙이기에 완벽합니다:
Object.keys(user); // ["name"] — symbol 키는 건너뜀
for (const k in user) {} // symbol을 건너뜀
JSON.stringify(user); // {"name":"Ann"} — symbol은 직렬화되지 않음
Object.getOwnPropertySymbols(user); // [Symbol(id)] — 나열하는 유일한 방법
그래서 라이브러리가 Symbol을 통해 당신의 객체에 내부 데이터를 저장하더라도 당신의 속성과 충돌하거나 당신의 루프에 나타날 위험이 없습니다.
가장 중요한 용도 — Symbol.iterator는 객체를 이터러블로 만듭니다:
const range = {
[Symbol.iterator]() {
let i = 1;
return { next: () => (i <= 3 ? { value: i++, done: false } : { done: true }) };
},
};
[...range]; // [1, 2, 3]
그 외: Symbol.asyncIterator, Symbol.toPrimitive(커스텀 강제 변환), Symbol.hasInstance.
Symbol.for("key"); // 앱 전체에 걸쳐 (그리고 realm 간에) 공유되는 심볼
Symbol은 충돌하지 않는 메타데이터 키를 가능하게 하고, 핵심 언어 프로토콜(반복, 강제 변환)에 연결할 수 있게 합니다 — 내장 객체와 프레임워크가 객체를 안전하게 확장하는 방식입니다.