Symbol を key とするオブジェクトプロパティ — obj[s] = 1
JavaScript の Symbol は「ユニークな識別子」を作るための型です。
オブジェクトのプロパティキーに Symbol を使うと、他の文字列キーと絶対に衝突しない特別なプロパティを作れます。
初心者は「隠しラベルをつける」イメージで覚えると理解しやすいです。
基本のコード例
const s = Symbol("id"); // 説明用ラベル(ユニーク性には関係なし)
const obj = {};
obj[s] = 1;
console.log(obj[s]); // → 1
JavaScriptSymbol("id")→ ユニークなキーを生成。obj[s] = 1→ そのキーを使ってプロパティを追加。- 他のキーと絶対に衝突しない。
よく使うテンプレート集
1. 通常のキーと共存
const id = Symbol("id");
const user = {
name: "Aki",
[id]: 12345
};
console.log(user.name); // → "Aki"
console.log(user[id]); // → 12345
JavaScript2. 複数の Symbol キー
const key1 = Symbol("k1");
const key2 = Symbol("k2");
const obj = {
[key1]: "value1",
[key2]: "value2"
};
console.log(obj[key1]); // → "value1"
console.log(obj[key2]); // → "value2"
JavaScript3. 列挙されないプロパティ
const secret = Symbol("secret");
const obj = { visible: "yes", [secret]: "hidden" };
console.log(Object.keys(obj)); // → ["visible"] (Symbolキーは出てこない)
console.log(Object.getOwnPropertySymbols(obj)); // → [Symbol(secret)]
JavaScript例題: 内部データを隠す
const secretKey = Symbol("secret");
class User {
constructor(name) {
this.name = name;
this[secretKey] = "hidden-data";
}
getSecret() {
return this[secretKey];
}
}
const u = new User("Mika");
console.log(u.name); // "Mika"
console.log(u.getSecret()); // "hidden-data"
JavaScript- 効果:
secretKeyは通常のキーと衝突せず、外部からも列挙されない。
実務でのコツ
- ユニーク性: 同じ説明をつけても別物。比較すると必ず false。
- 隠しプロパティ: ライブラリやフレームワークで「内部用のキー」としてよく使われる。
- 列挙されない:
for...inやObject.keys()では出てこない。必要ならObject.getOwnPropertySymbols()を使う。 - 共有したい場合:
Symbol.for("key")を使うとグローバルレジストリで共有できる。
ありがちなハマりポイントと対策
- JSON.stringify に含まれない: Symbol キーは JSON 化されない。
- 通常のループで見えない:
for...inやObject.keys()では Symbol プロパティは列挙されない。 - 説明ラベルは比較に使えない:
Symbol("id") === Symbol("id")→ false。
練習問題(状態管理)
const STATE = {
INIT: Symbol("init"),
RUNNING: Symbol("running"),
STOPPED: Symbol("stopped")
};
let current = STATE.INIT;
if (current === STATE.INIT) {
console.log("初期化中...");
}
JavaScript直感的な指針
Symbol= ユニークなキー。- オブジェクトの隠しプロパティや状態管理に便利。
- 列挙されないので「内部用データ」に最適。
- 共有したいなら
Symbol.for()を使う。
これを覚えれば「衝突しないキー」「安全な内部データ管理」ができ、大規模なコードでも安心して使えるようになります。
