ES6 - シンボルはじめに
まず、シンボルは何ですか?
Symbol
でES6
新たに導入された基本データ型。
Symbol()
関数は、静的プロパティと静的メソッドを有するタイプのシンボル・タイプの値を返します。:グローバル登録記号、および組み込みオブジェクトのクラスに類似を公開しますそれは静的メソッドですが、それは構文をサポートしていないので、それのコンストラクタは完了していないとして、それは性質がいくつかの組み込みのオブジェクトのメンバーにさらされる静的ですnew Symbol()
。
シンボルは、2つの変数を備えています
1、Symbol
新しい基本データ型として、我々が使用することができます:変数の型を、それが今でユニークです。let a = Symbol();定义
Symbol
let b = Symbol();
a = = = b; //false
2、それはパラメータを受け入れることができ、我々は2つの文字列が同一であってもよい場合でも、文字列の記述としてそれを渡すことができます。引数がオブジェクトである場合、それは最初のオブジェクトの呼び出しますtoString
文字列を変換する方法を。
let symbol1 = Symbol('some');
let symbol2 = Symbol('some'); symbol1 === symbol2;
//false
図3は、すべてのことを意味してSymbol
作成された値が同じではありません。あなたが使用することはできませんnew
作成する方法を:
let c = new Symbol(); //TypeError: Symbol is not a constructor
第三に、なぜべき記号の導入
1、オブジェクトにプロパティを増やすことができます
ではES5
、主に文字列のオブジェクトの前に属性名、名前は困難な作業であり、そしてすべてのに複数の名前が間違いを繰り返すように回します。そして、時には私たちは財産を増やすオブジェクトの1つを与えるために、他の誰かのコードを取り、我々はされ、名前が繰り返されていないのか分からないES6
に導入されたSymbol
根本的な原因。
let name = Symbol('name'); //加入 name 作为描述 let obj = { [name]: 'Baoyuan' //必须放在方括号之中 }; obj[name]; //'Baoyuan'
2、プロパティ名を横断
共通の属性をオブジェクト、我々は使用することができObject.keys()
、for...in
またはObject.getOwnPropertyNames()
横断するが、彼らは行き来することができないSymbol
属性名のタイプを。それは私有財産ではないことに注意してください。我々は使用することができObject.getOwnPropertySymbols
、指定されたオブジェクトを取得する方法をSymbol
属性。それはすべての現在のオブジェクト返すSymbol
プロパティタイプSymbol
値の配列を:
let a = Symbol('a');
let b = Symbol('b'); let c = 'c'; let obj = { [a]: 'a', [b]: 'b', c: 'c' }; let objNames = Object.getOwnPropertySymbols(obj); console.log(objNames); // [Symbol(a), Symbol(b)] let objName = Object.getOwnPropertyNames(obj); console.log(objName); // ["c"]
使用するReflect.ownKeys
属性名のすべてを通過することができます:
let names = Reflect.ownKeys(obj);
console.log(names); // ["c", Symbol(a), Symbol(b)]
図3に示すように、反復参照値シンボル
時々 、新しいSymbol
私たちは同じ記述子が同じ値を持っていない場合でも、もう一度、この時間を利用したい他の場所での値、そして私たちが必要としますSymbol.for()
:
let a = Symbol.for('hello');
let b = Symbol.for('hello'); a === b; // true
実際には、これらの二つは、新たな文言を持っていますSymbol
が、違いはSymbol
、新しい値を生成するために、常に、そしてSymbol.for
与えられた場合には最初に表示されますkey
値が存在し、新に行くために存在していない、地球環境に登録されます検索のために。我々は使用することができSymbol.keyFor
、登録見ることSymbol
の価値をkey
:
Symbol.keyFor(a); // "hello"
参考リンクします。https://www.jianshu.com/p/971996a7471f