ES6 Symbol語法
阿新 • • 發佈:2018-11-10
- 基本用法
// 沒有在global symbol registry註冊
Symbol() === Symbol() // false
Symbol('a') === Symbol('a') // false
typeof Symbol() // symbol, ES6新增資料型別
Object.prototype.toString.call(Symbol()) // '[object Symbol]'
Symbol() instanceof Symbol // false, Symbol不是完整的建構函式,不支援new
Symbol() instanceof Object // false, 原始值型別(primitive data type)
// symbol不能轉成string/number
1 + Symbol() // TypeError
'a' + Symbol() // TypeError
- Symbol.for()和Symbol.keyFor()
// 從global symbol registry返回匹配的symbol,沒有則新建
Symbol.for('a') === Symbol.for('a') // true
Symbol('a') === Symbol.for('a') // false,注意這裡
// 從global symbol registry返回指定symbol的key
Symbol.keyFor(Symbol()) // undefined
Symbol.keyFor(0) // TypeError: 0 is not a symbol
Symbol.keyFor(Symbol.for('a')) // 'a'
Symbol.keyFor(Symbol.for('')) // ''
Symbol.keyFor(Symbol.for()) // 'undefined'
Symbol.for() === Symbol.for(undefined ) // true
// Symbol.for(x)會先將x轉成string
typeof Symbol.keyFor(Symbol.for(0)) // string
// well-known symbol並不在global symbol registry
typeof Symbol.keyFor(Symbol.iterator) // undefined
- 作為物件的屬性
// symbol的目的是作為物件屬性的識別符號(an identifier for object property)
let obj = {a: 1, b: 2}
let s1 = Symbol('a')
let s2 = Symbol('b')
obj[s1] = 1
obj[s2] = 2
Object.getOwnPropertyDescriptor(obj, s1)
// {value: 1, writable: true, enumerable: true, configurable: true}
obj.hasOwnProperty(s1) // true
s1 in obj // true
// 以下方法不能獲取到Symbol屬性
Object.keys(obj) // [ 'a', 'b']
Object.getOwnPropertyNames(obj) // [ 'a', 'b']
JSON.stringify(obj) // {"a": 1, "b": 2}
for (let k in obj) {
console.log(k, obj[k]);
// 'a', 'b'
}
// 獲取物件的symbol屬性
Object.getOwnPropertySymbols(obj)
// [Symbol(a), Symbol(b)]
Reflect.ownKeys(obj)
// [ 'a', 'b', Symbol(a), Symbol(b)]