ECMAScript 2015以降、symbol
は number
や string
と同様にプリミティブデータ型です。
symbol
の値は Symbol
コンストラクターを呼び出すことで作成されます。
ts
let sym1 = Symbol();let sym2 = Symbol("key"); // optional string key
シンボルは不変であり、ユニークです。
ts
let sym2 = Symbol("key");let sym3 = Symbol("key");sym2 === sym3; // false, symbols are unique
文字列と同様に、シンボルはオブジェクトプロパティのキーとして使用できます。
ts
const sym = Symbol();let obj = {[sym]: "value",};console.log(obj[sym]); // "value"
シンボルは、計算されたプロパティ宣言と組み合わせて、オブジェクトプロパティとクラスメンバーを宣言することもできます。
ts
const getClassNameSymbol = Symbol();class C {[getClassNameSymbol]() {return "C";}}let c = new C();let className = c[getClassNameSymbol](); // "C"
unique symbol
シンボルをユニークなリテラルとして扱うことを可能にするために、特別な型 unique symbol
が用意されています。unique symbol
は symbol
のサブタイプであり、Symbol()
または Symbol.for()
の呼び出し、または明示的な型注釈からのみ生成されます。この型は const
宣言および readonly static
プロパティでのみ許可されており、特定のユニークシンボルを参照するには、typeof
演算子を使用する必要があります。ユニークシンボルへの各参照は、特定の宣言に結び付けられた完全にユニークな識別子を意味します。
tsTry
declare constsym1 : unique symbol;// sym2 can only be a constant reference.letA variable whose type is a 'unique symbol' type must be 'const'.1332A variable whose type is a 'unique symbol' type must be 'const'.: unique symbol = sym2 Symbol ();// Works - refers to a unique symbol, but its identity is tied to 'sym1'.letsym3 : typeofsym1 =sym1 ;// Also works.classC {static readonlyStaticSymbol : unique symbol =Symbol ();}
各 unique symbol
は完全に別個の識別子を持つため、2つの unique symbol
型は互いに代入可能でも比較可能でもありません。
tsTry
constsym2 =Symbol ();constsym3 =Symbol ();if (This comparison appears to be unintentional because the types 'typeof sym2' and 'typeof sym3' have no overlap.2367This comparison appears to be unintentional because the types 'typeof sym2' and 'typeof sym3' have no overlap.sym2 ===sym3 ) {// ...}
既知のシンボル
ユーザー定義のシンボルに加えて、既知の組み込みシンボルがあります。組み込みシンボルは、内部の言語動作を表すために使用されます。
以下は既知のシンボルのリストです。
Symbol.asyncIterator
オブジェクトの非同期イテレーターを返すメソッドで、for await..ofループで使用できます。
Symbol.hasInstance
コンストラクターオブジェクトが、あるオブジェクトを自身のインスタンスとして認識するかどうかを決定するメソッドです。instanceof演算子のセマンティクスによって呼び出されます。
Symbol.isConcatSpreadable
オブジェクトが Array.prototype.concat によって配列要素に平坦化されるべきであることを示すブール値です。
Symbol.iterator
オブジェクトのデフォルトイテレーターを返すメソッドです。for-of文のセマンティクスによって呼び出されます。
Symbol.match
正規表現を文字列と照合する正規表現メソッドです。String.prototype.match
メソッドによって呼び出されます。
Symbol.replace
文字列の一致した部分文字列を置き換える正規表現メソッドです。String.prototype.replace
メソッドによって呼び出されます。
Symbol.search
正規表現に一致する文字列内のインデックスを返す正規表現メソッドです。String.prototype.search
メソッドによって呼び出されます。
Symbol.species
派生オブジェクトの作成に使用されるコンストラクター関数である関数値のプロパティです。
Symbol.split
正規表現に一致するインデックスで文字列を分割する正規表現メソッドです。String.prototype.split
メソッドによって呼び出されます。
Symbol.toPrimitive
オブジェクトを対応するプリミティブ値に変換するメソッドです。ToPrimitive
抽象演算によって呼び出されます。
Symbol.toStringTag
オブジェクトのデフォルトの文字列記述の作成に使用される文字列値です。組み込みメソッド Object.prototype.toString
によって呼び出されます。
Symbol.unscopables
自身のプロパティ名が、関連付けられたオブジェクトの 'with' 環境バインディングから除外されるプロパティ名であるオブジェクト。