Symbol の基本 — const s = Symbol('desc')
JavaScript の Symbol は「一意(ユニーク)な値」を作るための型です。
初心者は「他と絶対にかぶらない特別なラベル」と覚えると理解しやすいです。
基本のコード例
const s1 = Symbol("desc");
const s2 = Symbol("desc");
console.log(s1 === s2); // → false (同じ説明でも別物)
JavaScriptSymbol("desc")→ 説明(description)はただのラベル。- 毎回新しい Symbol が生成されるので、絶対に一致しない。
よく使うテンプレート集
オブジェクトの隠しキー
const id = Symbol("id");
const user = {
name: "Aki",
[id]: 12345
};
console.log(user.name); // → "Aki"
console.log(user[id]); // → 12345
JavaScript- 効果:
idは通常のプロパティ名と衝突しない。
定数の識別子として使う
const STATUS = {
READY: Symbol("ready"),
WAIT: Symbol("wait"),
DONE: Symbol("done")
};
let state = STATUS.READY;
if (state === STATUS.READY) {
console.log("準備完了");
}
JavaScript- 効果: 状態をユニークに表現できる。文字列より安全。
Symbol を使った列挙
const COLOR = {
RED: Symbol("red"),
BLUE: Symbol("blue")
};
function paint(c) {
if (c === COLOR.RED) console.log("赤で塗ります");
else if (c === COLOR.BLUE) console.log("青で塗ります");
}
paint(COLOR.RED); // → "赤で塗ります"
JavaScript例題: ライブラリの拡張で衝突を防ぐ
const secret = Symbol("secret");
class User {
constructor(name) {
this.name = name;
this[secret] = "hidden-data";
}
getSecret() {
return this[secret];
}
}
const u = new User("Mika");
console.log(u.name); // "Mika"
console.log(u.getSecret()); // "hidden-data"
JavaScript- 効果:
secretプロパティは通常のキーと絶対に衝突しない。
実務でのコツ
- ユニーク性: 同じ説明をつけても別物。比較すると必ず false。
- 隠しプロパティ: ライブラリやフレームワークで「内部用のキー」としてよく使われる。
- 列挙や状態管理: 文字列より安全に「識別子」として使える。
- Symbol.for() を使うと共有できる:
const s1 = Symbol.for("shared"); const s2 = Symbol.for("shared"); console.log(s1 === s2); // true (グローバルレジストリで共有)
ありがちなハマりポイントと対策
Symbol("desc")は説明用ラベルであり、比較には使えない。- JSON.stringify に含まれない: Symbol プロパティは JSON 化されない。
- 通常のループで見えない:
for...inやObject.keys()では Symbol プロパティは列挙されない。- 対策:
Object.getOwnPropertySymbols(obj)を使う。
- 対策:
練習問題(状態管理)
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()を使う。
これを覚えれば「衝突しないキー」「安全な状態管理」ができ、ライブラリや大規模コードでも安心して使えるようになります。
