ES6 Symbol类型
一、基本语法
Symbol(descriptor)
: descriptor为其描述值,但无法用来反向检索到Symbol
const s = Symbol('keyName')
二、Symbol.for & Symbol.keyFor
Symbol.for(descriptor)
: 创建一个单例SymbolSymbol.keyFor(Symbol)
: 查找该Symbol对应的descriptor,必须是用Symbol.for
定义的,否则返回undefined
const s1 = Symbol('keyName')
const s2 = Symbol.for('keyName')
const s3 = Symbol.for('keyName')
s1 === s2 // false
s2 === s3 // true 单例模式
Symbol.keyFor(s1) // undefined
Symbol.keyFor(s2) // 'keyName'
三、JSON.stringify以及是否可迭代
- Symbol 不参与 JSON 序列化
- Symbol 是不可迭代的,
for...in
,for...of
,Object.keys
,Object.getOwnPropertyNames
都无法访问到SymbolObject.getOwnPropertySymbols
和Reflect.ownKeys
可以访问到Symbol
let o = {
[Symbol('keyName')]: 1,
a: 2
}
JSON.stringify(o) // "{'a': 1}"
四、类型转换
- 不能转为
Number
- 转为字符串,只能使用
String
类进行包装- 可以转为
Boolean
,为true
// 转Number
Symbol('keyName') + 1 // TypeError
Number(Symbol('keyName')) // TypeError
// 转String
Symbol('keyName') + '1' // TypeError
String(Symbol('keyName')) // "Symbol(name)"
// 转Boolean
!!Symbol('keyName') // true
Boolean(Symbol('keyName')) // true
注:
- 定义对象时中使用Symbol作键的语法:
{ [Symbol()]: 1 }
还没有评论,来说两句吧...