版权声明:本文为个人知识整理,欢迎指正、交流、转载。 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)]