1. 程式人生 > >ES6 Symbol語法

ES6 Symbol語法

  • 基本用法
// 沒有在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)]