JavaScript 逆引き集 | Symbol を key とするオブジェクトプロパティ

JavaScript JavaScript
スポンサーリンク

Symbol を key とするオブジェクトプロパティ — obj[s] = 1

JavaScript の Symbol は「ユニークな識別子」を作るための型です。
オブジェクトのプロパティキーに Symbol を使うと、他の文字列キーと絶対に衝突しない特別なプロパティを作れます。
初心者は「隠しラベルをつける」イメージで覚えると理解しやすいです。


基本のコード例

const s = Symbol("id"); // 説明用ラベル(ユニーク性には関係なし)

const obj = {};
obj[s] = 1;

console.log(obj[s]); // → 1
JavaScript
  • Symbol("id") → ユニークなキーを生成。
  • obj[s] = 1 → そのキーを使ってプロパティを追加。
  • 他のキーと絶対に衝突しない。

よく使うテンプレート集

通常のキーと共存

const id = Symbol("id");

const user = {
  name: "Aki",
  [id]: 12345
};

console.log(user.name); // → "Aki"
console.log(user[id]);  // → 12345
JavaScript

複数の 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"
JavaScript

列挙されないプロパティ

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...inObject.keys() では出てこない。必要なら Object.getOwnPropertySymbols() を使う。
  • 共有したい場合: Symbol.for("key") を使うとグローバルレジストリで共有できる。

ありがちなハマりポイントと対策

  • JSON.stringify に含まれない: Symbol キーは JSON 化されない。
  • 通常のループで見えない: for...inObject.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() を使う。

これを覚えれば「衝突しないキー」「安全な内部データ管理」ができ、大規模なコードでも安心して使えるようになります。

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