記号

シンボルは比較的新しい 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 を使用してシンボルを作成できますか?

いいえ

「よく知られた」記号について説明しているものは次のうちどれですか。

`Symbol` オブジェクトの静的プロパティ
JavaScript API へのアクセスと変更に使用する一意のプロパティ キー メソッドを組み込み、
よく使用するシンボル