JavaScript symbol:変数のデータ型

English version.

symbol は、ECMAScript 6(ES6)で導入された新しいデータ型の1つで、一意の識別子を表現するために使用されます。symbol は、文字列や数値のようにプリミティブなデータ型であり、不変であり、一意の値を持ちます。

symbol の値は、Symbol() 関数を呼び出すことによって作成されます。

const mySymbol = Symbol();

Symbol() 関数には、オプションで説明文を引数として渡すこともできます。説明文は toString() メソッドで表示されるため、デバッグ時に役立ちます。

const mySymbol = Symbol('This is a symbol');
console.log(mySymbol.toString()); // "Symbol(This is a symbol)"

symbol の主な用途は、オブジェクトのプロパティ名として使用することです。symbol をプロパティ名にすると、そのプロパティにアクセスするためには、[ ] 演算子を使用する必要があります。

const mySymbol = Symbol('This is a symbol');
const myObj = {};

myObj[mySymbol] = 'Hello, world!';
console.log(myObj[mySymbol]); // "Hello, world!"

symbol は、一意で不変な値を表現するために使用されます。プロパティ名として使用することで、衝突のない一意のプロパティ名を作成することができます。また、symbol は、プライベートなプロパティやメソッドを実装するためにも使用されます。

symbol 同士を比較すると、true が返されるのは、同じ記号を参照している場合に限られます。つまり、symbol は一意の値であるため、別々に作成された symbol は、異なる値を持っています。

以下は、symbol 同士を比較する例です。

const symbol1 = Symbol('foo');
const symbol2 = Symbol('foo');

console.log(symbol1 === symbol2); // false

この例では、symbol1symbol2 は、同じ説明文を持つ symbol ですが、それぞれ独自の値を持っているため、false が返されます。

一方、Symbol.for() メソッドを使用すると、グローバルなシンボルレジストリに symbol を登録し、同じ説明文を持つ symbol は同じ値を持つようになります。したがって、以下のコードでは、symbol3symbol4 は同じ symbol を参照しているため、true が返されます。

const symbol3 = Symbol.for('foo');
const symbol4 = Symbol.for('foo');

console.log(symbol3 === symbol4); // true

Symbol.for() メソッドによって、グローバルな symbol を作成することができますが、その代わりに、名前が競合しない限り、通常の Symbol() メソッドを使用して、symbol を作成することをお勧めします。

関連記事

JavaScriptの記事一覧