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 類型值的 key

    Symbol.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']

參考資料: