ES 6のSymbol

1483 ワード

(1).ES 6は、新たな元のデータタイプSymbolを導入し、ユニークな値を表します.JavaScript言語の第7種類のデータタイプで、最初の6種類はundefined、null、ブール値(Boolean)、文字列(String)、数値(Number)、オブジェクト(Object)です.Symbol値はSymbol関数により生成される.つまり、オブジェクトの属性名は2つのタイプがあります.一つは元々あった文字列で、もう一つはSymbolタイプです.すべての属性名はSymbolタイプに属しており、他の属性名と衝突しないことを保証できます.
let s = Symbol();
typeof s
// "symbol"
(2)Symbol関数は、一つの文字列をパラメータとして受け入れることができ、Symbolの例についての説明を表します.主にコンソールで表示するため、または文字列に変換する場合、比較的区別しやすいです.
let s1 = Symbol('foo');
let s2 = Symbol('bar');

s1 // Symbol(foo)
s2 // Symbol(bar)

s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"
上のコードのうち、s 1とs 2は2つのSymbol値です.パラメータが追加されていない場合は、コンソールでの出力はすべてSymbol()であり、区別に不利である.パラメータがあれば、説明を加えたものと同じです.出力するときは、どの値なのかを見分けられます.なお、Symbol関数のパラメータは現在のSymbol値の記述のみを表しているので、同じパラメータのSymbol関数の戻り値は等しくない.(3)ES 2019は、Symbolの説明に直接戻る例示的な属性descriptionを提供する.
const sym = Symbol('foo');
sym.description // "foo"
(4)属性名の遍歴Symbolは属性名として、この属性はfor...in、for...ofサイクルには現れません.Object.keys()、Object.getOwn PropertyNames()、JSON.strigify()にも返されません.しかし、プライベート属性ではなく、Object.getOwn PropertySymbolメソッドがあり、指定されたオブジェクトのすべてのSymbol属性名を取得することができます.(5)Symbol.for()Symbol.for()とSymbol()の2つの表記は、いずれも新しいSymbolを生成します.それらの違いは、前者がグローバル環境に登録されて検索できます.後者はできません.Symbol.for()は呼び出しごとに新しいSymbolタイプの値を返しません.与えられたkeyが既に存在しているかどうかを先に確認します.存在しない場合は新しい値を作成します.例えば、Symbol.for(cat)を30回呼び出すと、毎回同じSymbol値を返しますが、Symbol(cat)を30回呼び出すと、30個のSymbol値が戻ります.