Symbol
數據類型Symbol,表示獨一無二的值。
對象的屬性名可有兩種類型,一種是原來的字符串,另一種是新增的 Symbol 類型
可以保證不與其他屬性名產生沖突。
let s1 = Symbol()
let s2 = Symbol()
console.log(s1, s2, s1 == s2)//Symbol() Symbol() false
可以接受一個字符串作為參數,表示對 Symbol 實例的描述
let s1 = Symbol('foo');
如果 Symbol 的參數是一個對象,就會調用該對象的toString
方法
const obj = {toString() {return 'abc';}
};
const sym = Symbol(obj);
sym // Symbol(abc)
Symbol.prototype.description
讀取Symbol的描述
const sym = Symbol('foo')
sym.description //foo
作為屬性名
let mySymbol = Symbol();
let a = {};a[mySymbol] = 'Hello!';
let a = {let a = {};};
let a = {};Object.defineProperty(a, mySymbol, { value: 'Hello!' });
屬性名的遍歷
Symbol 作為屬性名,遍歷對象的時候,該屬性不會出現在for...in
、for...of
循環中,也不會被Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回
Object.getOwnPropertySymbols()
方法,可以獲取指定對象的所有 Symbol 屬性名。該方法返回一個數組,成員是當前對象的所有用作屬性名的 Symbol 值。
const objectSymbols = Object.getOwnPropertySymbols(obj);
Reflect.ownKeys()
方法可以返回所有類型的鍵名,包括常規鍵名和 Symbol 鍵名
let obj = {[Symbol('my_key')]: 1,enum: 2,nonEnum: 3
};
Reflect.ownKeys(obj)
// ["enum", "nonEnum", Symbol(my_key)]
Symbol.for()
Symbol("cat")
每次調用都會返回一個新的值。
Symbol.for()
會先檢查給定的key
是否已經存在,存在:每次都會返回同一個 Symbol 值;如果不存在:才會新建一個值。
Symbol.for("bar") === Symbol.for("bar")// trueSymbol("bar") === Symbol("bar")
// false
由于
Symbol()
寫法沒有登記機制,所以每次調用都會返回一個不同的值。
Symbol.keyFor()
Symbol.keyFor()
方法返回一個已登記的 Symbol 類型值的key
。
let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
注意,Symbol.for()
為 Symbol 值登記的名字,是全局環境的,不管有沒有在全局環境運行。