ES6 Symbol语法

版权声明:本文为个人知识整理,欢迎指正、交流、转载。 https://blog.csdn.net/u014711094/article/details/79188079
  • 基本用法
// 没有在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)]

猜你喜欢

转载自blog.csdn.net/u014711094/article/details/79188079