Symbol
// 每个从Symbol()返回的symbol值都是唯一的。
// 一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的
let a1 = Symbol('a')
let a2 = Symbol('a')
// 根据给定的键 key,来从运行时的 symbol 注册表中找到对应的 symbol,
// 如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入全局 symbol 注册表中。
let a3 = Symbol.for('a')
// a4查找到了a3的key,之前定义过,所以两者相等
let a4 = Symbol.for('a')
// false
console.log(a1 === a2)
// true
console.log(a3 === a4)
let a = Symbol.for('name')
let b = Symbol.for('game')
let obj = {
[a]: 'ronle',
[b]: 'LOL',
name: 'kaka'
}
// {name: "kaka", Symbol(name): "ronle", Symbol(game): "LOL"}
console.log(obj)
// 常规的for,Symbol的key是拿不到的
for (let [key, value] of Object.entries(obj)) {
// name kaka
console.log(key, value)
}
// 拿到Symbol的key和value,但普通对象的key和value拿不到
Object.getOwnPropertySymbols(obj).forEach((item) => {
// 这样就可以循环遍历到值
// Symbol(name) "ronle"
// Symbol(game) "LOL"
console.log(item, obj[item])
})
// 拿到对象里所有的key和value
Reflect.ownKeys(obj).forEach((item) => {
console.log('ownKeys', item, obj[item])
})