JavaScript symbol:変数のデータ型
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
この例では、symbol1 と symbol2 は、同じ説明文を持つ symbol ですが、それぞれ独自の値を持っているため、false が返されます。
一方、Symbol.for() メソッドを使用すると、グローバルなシンボルレジストリに symbol を登録し、同じ説明文を持つ symbol は同じ値を持つようになります。したがって、以下のコードでは、symbol3 と symbol4 は同じ symbol を参照しているため、true が返されます。
const symbol3 = Symbol.for('foo');
const symbol4 = Symbol.for('foo');
console.log(symbol3 === symbol4); // true
Symbol.for() メソッドによって、グローバルな symbol を作成することができますが、その代わりに、名前が競合しない限り、通常の Symbol() メソッドを使用して、symbol を作成することをお勧めします。