Symbol
es6新增的数据类型
Symbol的概念
- 这种数据类型提供一个独一无二的值
Symbol的作用
{
//Symbol 声明
//生成独一无二的值
let a1 = Symbol();
let a2 = Symbol();
console.log(a1===a2);//false
//使用同一个key值(a3),所以可以相等
let a3 = Symbol.for('a3');
let a4 = Symbol.for('a3');
console.log(a3 === a4);//true
}
{
//Symbol 使用场景
//防止属性被重复,然后覆盖,因为这样能让属性名是独一无二的
let a1=Symbol.for('abc');//使用key值'abc'生成一个独一无二的变量a1
let obj = {
[a1]:'123',//如果没有a1作为独一无二的变量,这里会报错
'abc': 345,
'c': 456
}
console.log(obj);
//{abc: 345, c: 456, Symbol(abc): "123"}
//注意:对象中使用Symbol作为key值的话,通过for in; let of 都是拿不到Symbol值的属性
for(let [key,value] of Object.entries(obj)){
console.log('let of', key,value);
}
//abc 345
//c 456
//这里是拿不到Symbol的属性值的
//通过Object.getOwnPropertySymbols()方法获取带有Symbol对象的所有属性,这个方法返回的是一个数组
Object.getOwnPropertySymbols(obj).forEach(function(item){
console.log(item,obj[item])//Symbol(abc) 123
})
//Reflect.ownKeys() 方法解决带有Symbol对象的属性,返回值包含Symbol和非Symbol属性,返回值是个数组
Reflect.ownKeys(obj).forEach(function(item){
console.log('ownKeys',item,obj[item]);
})
//abc 345
//c 456
//Symbol(abc) 123
}