常に一意な値を生成するプリミティブ型。衝突しないプロパティキーとして使う
// ── Symbol: 一意で不変のプリミティブ値 ─────────────────
// Symbol() を呼ぶたびに必ず異なる値が生成される
const id1 = Symbol('id');
const id2 = Symbol('id');
console.log(id1 === id2); // false ← 同じ説明でも異なる値!
// ── よくある使い方: プロパティのキーとして使う ─────────
// 通常の文字列キーと衝突しない「隠し」プロパティを作れる
const SECRET = Symbol('secret');
const user = {
name: '田中',
[SECRET]: 'password123', // Symbol をキーに使う
};
console.log(user.name); // '田中'
console.log(user[SECRET]); // 'password123'
// Object.keys() には表示されない(隠蔽できる)
console.log(Object.keys(user)); // ['name'] ← SECRET は見えない
// ── Symbol.iterator: イテレーターを実装する ──────────
const range = {
from: 1, to: 5,
[Symbol.iterator]() { // ← for...of で使えるようになる
let current = this.from;
return {
next: () => current <= this.to
? { value: current++, done: false }
: { value: undefined, done: true }
};
}
};
for (const n of range) console.log(n); // 1, 2, 3, 4, 5Symbolキーはfor...inやObject.keys()に列挙されないため「半プライベート」なプロパティとして使われる。グローバル共有にはSymbol.for()を使う。