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() ]