Symbol

JavaScript では、 Symbol は プリミティブ値 です。

"symbol" データ型を持つ値は「シンボル値」として見ることができます。 JavaScript の実行時環境では、シンボル値は Symbol 関数を呼び出すことで生成され、動的に無名の一意の値を生み出します。シンボルはオブジェクトプロパティとして使用されることがあります。

Symbol は任意で説明を持つことができますが、これはデバッグ目的のみに利用されます。

Symbol 型は ECMAScript 2015 の新機能であり、 ECMAScript 5 にはシンボルに相当するものはありません。プログラミング言語によっては、シンボルデータ型は「アトム」と呼ばれています。

Well-known symbol

Symbol クラスには、 well-known symbol と呼ばれる定数があります。これらのシンボルによって、 JavaScript がオブジェクトをどのように扱うかを、プロパティキーとして使用することで構成することができます。 well-known symbol の例としては、配列風オブジェクトのための Symbol.iterator、文字列オブジェクトのための Symbol.search などがあります。

グローバルシンボルレジストリ

グローバルシンボルレジストリを扱うメソッドは Symbol.for()Symbol.keyFor() があります。これらは、グローバルシンボルテーブル(または「レジストリ」)とランタイム環境の間を仲介します。シンボルレジストリは、主に JavaScript コンパイラーインフラストラクチャが構築しており、その中の symbol の内容は、 JavaScript ランタイムインフラストラクチャでは上記のメソッド以外で扱えません。 Symbol.for("tokenString") メソッドはレジストリ内のシンボル値を返し、 Symbol.keyFor(symbolValue) メソッドはレジストリからトークンの文字列を返します。この二つは対照的で、下記の結果は true です。

Symbol.keyFor(Symbol.for("tokenString")) == "tokenString"; // true

関連情報

一般知識