- 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 // false
Symbol.for('key')
一樣會生成新的 Symbol,而兩個 key 值相同的 Symbol 是相同的(有一樣的 id)const b = Symbol.for('Symbal B') const bb = Symbol.for('Symbal B') b === bb // true
Symbol.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']
參考資料: