Symbol は一意かつイミュータブルなプリミティブです。作成する Symbol() はすべて確実に区別される — 同じ説明(description)を持つ2つでさえ等しくありません。その主な役割は、衝突しないオブジェクトのキーになることです。
js
const id = Symbol("id");
id2 = ();
id === id2;
user = { [id]: , : };
user[id];
Symbol は一意かつイミュータブルなプリミティブです。作成する Symbol() はすべて確実に区別される — 同じ説明(description)を持つ2つでさえ等しくありません。その主な役割は、衝突しないオブジェクトのキーになることです。
const id = Symbol("id");
id2 = ();
id === id2;
user = { [id]: , : };
user[id];
Symbol をキーとするプロパティは文字列キーと衝突せず、通常の列挙からは隠されます — オブジェクトを汚さずにメタデータを付加するのに最適です。
Object.keys(user); // ["name"] — symbol key is skipped
for (const k in user) {} // skips the symbol
JSON.stringify(user); // {"name":"Ann"} — symbol not serialized
Object.getOwnPropertySymbols(user); // [Symbol(id)] — only way to list them
つまりライブラリは、あなたのプロパティとの衝突を起こすリスクや、あなたのループに現れるリスクなしに、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"); // shared symbol across the whole app (and across realms)
Symbol は衝突しないメタデータキーを可能にし、コアな言語プロトコル(反復、型変換)にフックできるようにします — 組み込みやフレームワークがオブジェクトを安全に拡張する仕組みです。