symbol是独一无二的
symbol的意思是独一无二的,哪怕内容一样。他们也是不同的
let a = Symbol('0')
let b = Symbol('0')
console.log(a == b)
symbol的描述
根据symbol描述的形式,分为局部的描述和全局的描述
局部的描述
let a = Symbol('0')
let b = Symbol('1')
console.log(a)
console.log(b)
//里面的值就是描述,让我们获取这两个描述
console.log(a.description)
console.log(b.description)
全局的描述
let a = Symbol.for('0')
let b = Symbol.for('0')
console.log(a === b)//这个时候就是相等的了,因为会从全局里面去找
//获取全局的描述,注意这里传递的是变量!!!
console.log(Symbol.keyFor(a))
//当然以前的这个也可以使用
console.log(a.description)
symbol的描述是对象时候
当描述是对象的时候,有点小小的说明
let obj = {
name: '小明',
age: '18'
}
let a = Symbol(obj)
console.log(a.description)//[object Object]
//上面在调用description的时候,其实是调用对象的toString()方法
//改写toString()方法
let obj = {
name: '小明',
age: '18',
toString(){
console.log(this)
}
}
let a = Symbol(obj)
console.log(a.description)//[object Object]
symbol的遍历
当一个数据结构中含有symbol时候,使用以下是无法遍历出的
for in
for of
正确的遍历方式
//for of + reflect
class User{
constructor(name,age){
this.name = name
this[Symbol('age')] = age
}
}
const user = new User('小明',18)
for ( let key of Reflect.ownKeys(user) ){
console.log(key)
}
symbol的使用场景
当对象中键为相同,但是其值不同。消除冲突
let obj ={
[Symbol('李四')]:{age:18},
[Symbol('李四')]:{age:19}
}
console.log(obj)
symbol的总结
如果是遇到独一无二的时候,就使用这种结构