Symbolは、ECMAScript 6（ES6）で導入された新しいデータ型であり、プリミティブ型の一種です[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol Symbol - JavaScript｜MDN]。
Symbolは、ユニークな識別子を生成するために使用されます。
従来のJavaScriptの文字列や数値とは異なり、Symbolは他のどの値とも異なることが保証されています。
Symbolは、オブジェクトのプロパティ名として使用されることが多く、ES6で導入された新しい機能であるプロキシや反復子などでも使用されています。
このチュートリアルでは、Symbolの基本的な使い方、作成方法、プロパティ、メソッド、および実用的な例について解説します。
__TOC__
Symbolは、プリミティブデータ型の一つであり、一意の識別子を作成するために使用されます。Symbolは、文字列とは異なり、値が一意であるため、異なる場所で同じSymbolを使用することができます。Symbolは、通常オブジェクトのプロパティ名として使用され、他のプロパティ名と混同されることがないようにするために使用されます。
Symbolを作成するには、グローバルなSymbol()関数を呼び出します。引数を渡すことができますが、引数は説明的な目的でのみ使用され、Symbolの一意性には影響を与えません。
const sym1 = Symbol();
const sym2 = Symbol('description');
Symbolには、次のようなプロパティがあります。
Symbol.iterator: オブジェクトのデフォルトのイテレーター関数を定義するために使用されます。
Symbol.toStringTag: オブジェクトの文字列表現に使用されるシンボルです。
Symbol.species: 派生オブジェクトを作成する際に、その元となるオブジェクトのコンストラクタを参照するために使用されます。
Symbolには、次のようなメソッドがあります。
Symbol.for(key): グローバルシンボルレジストリから、指定されたキーに対応するSymbolを返します。存在しない場合は新しいSymbolを作成します。
Symbol.keyFor(sym): グローバルシンボルレジストリから、指定されたSymbolに対応するキーを返します。存在しない場合はundefinedを返します。
Symbolは、オブジェクトのプロパティ名として使用されることが多く、以下のような例があります。
const MY_KEY = Symbol();
const obj = {};
obj[MY_KEY] = 123;
console.log(obj[MY_KEY]); // 123
また、グローバルシンボルレジストリを使用して、アプリケーション全体で一意のシンボルを共有することができます。例えば、以下のようにして、シンボルを共有することができます。
// module1.js
const MY_KEY = Symbol.for('my key');
// module2.js
const MY_KEY = Symbol.for('my key');
console.log(MY_KEY === module1.MY_KEY); // true
Well-known symbolsは、JavaScriptにおいて標準的に定義されたシンボルで、特定の動作をするために使用されます。
以下は、Well-known symbolsの一覧表です。
これらのシンボルは、JavaScriptの標準的な動作をカスタマイズしたり、自分で定義したオブジェクトに特定の機能を追加するために使用されます。
以下は、JavaScriptのSymbolに関するチートシートです。
// Symbolの基本的な使い方
const mySymbol = Symbol('mySymbol');
// 作成方法
const symbol1 = Symbol();
const symbol2 = Symbol('symbol2');
// プロパティ
console.log(Symbol.iterator); // Symbol(Symbol.iterator)
// メソッド
const symbol3 = Symbol.for('symbol3');
console.log(Symbol.keyFor(symbol3)); // symbol3
// 実用的な例
const myObj = {};
const mySymbol1 = Symbol('mySymbol1');
const mySymbol2 = Symbol('mySymbol2');
myObj[mySymbol1] = 'value1';
myObj[mySymbol2] = 'value2';
console.log(myObj[mySymbol1]); // value1
console.log(myObj[mySymbol2]); // value2
上記のコードでは、以下の内容を含んでいます。
このチートシートは、Symbolの基本的な使い方やプロパティ、メソッド、実用的な例を網羅しています。
これらの情報を参考に、Symbolを使った開発をスムーズに進めていくことができるでしょう。
Symbol: ES2015で導入されたプリミティブ型の一つで、一意の識別子を作成するために使用されます。
Symbol.for(key): グローバルなシンボルレジストリを介して、指定されたキーで登録された既存のシンボルを返します。存在しない場合は、新しいシンボルを作成します。
Symbol.keyFor(sym): グローバルなシンボルレジストリから、指定されたシンボルに関連付けられたキーを取得します。キーが見つからない場合はundefinedを返します。
Symbol.iterator: オブジェクトがfor...ofループで反復可能であることを示すシンボルです。
Well-known symbols: 既存のシンボルのうち、特定の目的で予約されているものを示す用語です。例えば、Symbol.iteratorはWell-known symbolsの一つです。
Symbol.species: インスタンスを作成するためのファクトリーメソッドを持つコンストラクタ関数において、生成されるオブジェクトの種類を表すシンボルです。
Symbol.hasInstance: オブジェクトが特定のコンストラクタ関数のインスタンスであるかどうかを判定するために使用されるシンボルです。
Symbol.toStringTag: オブジェクトのデフォルトの文字列化時に使用されるタグ名を表すシンボルです。
Symbol.match: 正規表現のマッチングを行うためのシンボルです。
Symbol.toPrimitive: オブジェクトをプリミティブ値に変換するためのシンボルです。
Symbol.isConcatSpreadable: 配列をconcat()メソッドで展開するかどうかを示すシンボルです。
Symbol.unscopables: with文によってスコープされないプロパティ名の集合を表すシンボルです。
Symbol.asyncIterator: オブジェクトがfor-await-ofループで反復可能であることを示すシンボルです。