Symbol

184 阅读1分钟

Symbol

  • Symbol符号,原始数据类型,表示独一无二的值
new Symbol() === new Symbol()//false

const sym = new Symbol('uni')//uni就是这个值的描述文本
console.log(sym) //Symbol(uni)
  • 使用:避免对象名重复
const obj ={}
obj[Symbol()]='213'
obj[Symbol()]='435'
console.log(obj)//{Symbol(): "213", Symbol(): "435"}

对象私有成员属性
const name = Symbol()
const person = {
    [name]:'L',
    say(){
    console.log(this[name])
    }
}
person.say()//'L'
  • Symbol的for方法,相同的字符串传参一定会返回相同的Symbol值
const a = Symbol.for('L')
const b = Symbol.for('L')
console.log(a === b)//true
如果传入的不是字符串,symbol内部会帮你把传参转换成字符串
console.log( Symbol.for('true') ===  Symbol.for(true))//true
  • Symbol自定义toString标签
const obj ={
    [Symbol.toStringTag]:'XObject'
}
console.log(obj.toString()) //[object XObject]

toStringTag是Symbol的内部常量

  • for in 无法遍历到对象的Symbol属性
  • Object.keys JSON.stringify 也获取不到对象的Symbol属性
  • Symbol属性适合作为对象的私有属性
  • Object.getOwnPropertySymbols() 获取对象中所有Symbol属性名组成的数组
const obj = {
  [Symbol()]: "Symbol value",
  foo: "normal value",
  age:19
};
for (let key in obj) {
  console.log(key);
}
// foo age
console.log(Object.keys(obj));
//[ 'foo', 'age' ]
console.log(JSON.stringify(obj));
//{"foo":"normal value","age":19}
console.log(Object.getOwnPropertySymbols(obj));
//[ Symbol() ]