JavaScript 逆引き集 | Symbol の基本

JavaScript JavaScript
スポンサーリンク

Symbol の基本 — const s = Symbol('desc')

JavaScript の Symbol は「一意(ユニーク)な値」を作るための型です。
初心者は「他と絶対にかぶらない特別なラベル」と覚えると理解しやすいです。


基本のコード例

const s1 = Symbol("desc");
const s2 = Symbol("desc");

console.log(s1 === s2); // → false (同じ説明でも別物)
JavaScript
  • Symbol("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...inObject.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() を使う。

これを覚えれば「衝突しないキー」「安全な状態管理」ができ、ライブラリや大規模コードでも安心して使えるようになります。

タイトルとURLをコピーしました