シンボルは比較的新しい ES6 で導入されたプリミティブです。シンボル プリミティブは、 他の値(他のシンボル プリミティブの値を含む)と衝突しない。 同一の文字で構成される 2 つの文字列プリミティブは、厳密に評価される 次と等しい:
String() === String()
> true
String( "My string." ) === String( "My string." );
> true
ただし、Symbol()
関数を使用して作成された 2 つのシンボルを
厳密に等しい:
Symbol() === Symbol()
> false
このトレイトを使用すると、記号をオブジェクト内の一意のプロパティキーとして使用できるため、 キーとの競合を防げます。
const mySymbol = Symbol( "Desc" );
const myObject = {
}
myObject
> Object { Symbol("Desc"): "propSymbol" }
記号には次の 3 種類があります。
Symbol()
で作成されたシンボル-
Symbol.for()
- 「よく知られたシンボル」Symbol オブジェクトの静的プロパティとして定義されます。 これらのシンボルには、誤って上書きされない内部メソッドが含まれています。
Symbol()
は、オプションの引数として説明(シンボル名)を受け取ります。
これらの説明は、デバッグを目的とした、人が読める形式のラベルであり、
結果の一意性に影響しません。Symbol
を呼び出すと、
複数の呼び出しに同じものが存在しても、完全に一意のシンボル プリミティブ
説明:
Symbol( "My symbol." ) === Symbol( "My symbol." );
> false
他のプリミティブ データ型と同様に、シンボルはメソッドとプロパティを プロトタイプ。たとえば、説明には、作成されたシンボルの継承プロパティとしてアクセスできます。
let mySymbol = Symbol( "My symbol." );
mySymbol.description
> "My symbol."
ただし、new
キーワードを使用してシンボルを作成することはできません。
let mySymbol = new Symbol();
> Uncaught TypeError: Symbol is not a constructor
シンボルは列挙不可、つまりシンボリック プロパティは使用できない
パフォーマンスが向上しますgetOwnPropertySymbols()
メソッドを使用すると、オブジェクトのシンボル プロパティにアクセスできます。
共有シンボル
Symbol.for()
メソッドは、既存のシンボルを
指定された文字列をキーとして、ランタイム全体のグローバル シンボル レジストリを作成し、
見つかった場合はそのシンボルを返します。見つからない場合は、シンボルが作成されます。
使用してグローバル レジストリに追加します。
let sharedSymbol = Symbol.for( "My key." );
sharedSymbol === Symbol.for( "My key." )
> true
これらのキーは、割り当てられている説明と機能的に重複していません
作成者が作成した Symbol
プリミティブ。シンボル レジストリ内のシンボルにアクセスするには、
まず、for()
を使用して作成する必要があります。
Symbol( "String" ) === Symbol( "String" );
> false
Symbol( "String" ) === Symbol().for( "String" );
> false
Symbol().for( "String" ) === Symbol().for( "String" );
> true
シンボル レジストリからシンボルのキーを取得するには、次のコマンドを使用します。
Symbol.keyFor()
:
let mySymbol = Symbol.for( "Key." );
Symbol.keyFor( mySymbol ) ;
> "Key."
「よく知られている」記号
既知のシンボルは、Symbol
オブジェクトの静的プロパティで、各シンボルは
記号そのものです。よく知られている記号は、文字列を表す一意のプロパティキーを提供します。
JavaScript の組み込みメソッドへのアクセスと変更を実現しながら、
意図しない動作を防ぐことができます。
Symbol;
> function Symbol()
asyncIterator: Symbol(Symbol.asyncIterator)
for: function for()
hasInstance: Symbol("Symbol.hasInstance")
isConcatSpreadable: Symbol("Symbol.isConcatSpreadable")
iterator: Symbol(Symbol.iterator)
keyFor: function keyFor()
length: 0
match: Symbol("Symbol.match")
matchAll: Symbol("Symbol.matchAll")
name: "Symbol"
prototype: Object { … }
replace: Symbol("Symbol.replace")
search: Symbol("Symbol.search")
species: Symbol("Symbol.species")
split: Symbol("Symbol.split")
toPrimitive: Symbol("Symbol.toPrimitive")
toStringTag: Symbol("Symbol.toStringTag")
unscopables: Symbol("Symbol.unscopables")
<prototype>: function ()
シンボルは ES6 に固有の機能であるため、これらのシンボリック値は 「拡張ポイント」として使用することを想定した変更する場合の 下位互換性の問題を引き起こすことなく、コードの動作を改善できます。
よく知られているシンボル値は、たいてい
@@
接頭辞または %
でラップして、
鍵と可変プロトタイプを区別します。例: @@match
(または %match%
)は、不変の Symbol.match
への参照です。
String.prototype.match
。
理解度をチェックする
new
を使用してシンボルを作成できますか?
「よく知られた」記号について説明しているものは次のうちどれですか。