- Published on
[學習筆記] ES6 中的新資料型別:Symbol
JavaScript的原始型別除了大家熟知的 Boolean, Null, Undeifined, String, Number 又多了第七個資料類型 Symbol
Symbol()
透過
Symbol()建立的值內部會建立一個獨特的 id,都是獨一無二的(unique),可作為獨特不重複的物件屬性名稱可以在裡面加入描述,
Symbol('key'),即使 key 值相同,兩個 Symbol 也不會相同const a = Symbol('Symbal A') const aa = Symbol('Symbal A') a == aa // false a === aa // falseSymbol.for('key')一樣會生成新的 Symbol,而兩個 key 值相同的 Symbol 是相同的(有一樣的 id)const b = Symbol.for('Symbal B') const bb = Symbol.for('Symbal B') b === bb // trueSymbol.keyFor可以找到一個已登記的 Symbol 類型值的 keySymbol.keyFor(a) // undefined Symbol.keyFor(aa) // undefined Symbol.keyFor(b) // Symbal B Symbol.keyFor(bb) // Symbol B要取得 Symbol 屬性值的時候,不能用
.點運算子存取(因為點運算子後面必須要接字串),只能用中括號[]
Symbol 作為物件的 key 值
定義屬性鍵名(key)時要放入中括號裡面,不然會變成字串而不是 Symbol 值
const obj = {
[Symbol('a')]: 'This is a',
[Symbol('aa')]: 'This is aa'
}
取得物件中的 Symbol
Symbol 無法透過迭代(如 for…in )的方式取得
Object.getOwnPropertySymbols(obj):取得物件中的 Symbol 類型 key,組成為陣列後回傳Reflect.ownKeys():取得物件中所有的 key,組成陣列後回傳- 無法用
Object.keys()、Object.getOwnPropertyNames(obj)取得 Symbol
const obj = {
name: 'Alice',
[Symbol('a')]: 'This is a',
[Symbol('aa')]: 'This is aa'
}
Object.getOwnPropertySymbols(obj) // [Symbol(a), Symbol(aa)]
Reflect.ownKeys(obj) // ['name', Symbol(a), Symbol(aa)]
Object.keys(obj) // ['name']
Object.getOwnPropertyNames(obj) // ['name']
參考資料: