Symbol(ES6中新增加的数据类型)
1.Symbol的概念
* 这种数据类型提供独一无二的值;
比如:在js中声明一个数据类型number=5;还可以通过变量b生成一个数据类型number=5的一个值;这两个值是相等的,可以理解是一样的;
用Symbol声明的这个值不重复不相等; 用Symbol这种数据类型声明一个变量a,同样在用Symbol声明一个变量b,a和b永远都相等;
* 用这种方式声明的数据类型变量的话,得到的值永远不会相等,保证它们是唯一的,独一无二的;
2.symbol的作用
- symbol怎么声明一个值;
{
//symbol声明的变量永远是独一无二的;
let a1 = Symbol();
let a2 = Symbol();
console.log(a1===a2); //false
//变量是独一无二,使用的时候怎么取到这个值,没法恢复和还原?
//Symbol.for(参数);这个参数是一个key值,当有这个key值的时候,for去声明这个独一无二的
变量的时候,会先检查这个key值,是不是在全局注册过,如果注册过就返回那个值,如果没注册过,
就调symbol生成一个独一无二的值;
//用a3这个key值,生成了一个独一无二的变量a3;
let a3 = Symbol.for('a3');
//在去生成a3为key值的变量的时候,之前已经定义过a3,a4应该拿到的是a3这个值;所以a3和a4应该
是相等的;
let a4 = Symbol.for('a3');
console.log(a3===a4);// true
}
- 怎么用?什么场景用?
1.如果之前不实用Symbol.for定义一个a1独一无二的值,可以理解key值是abc,下面obj里面也有一个abc,这个时候会报错的;
2.obj这里定义过abc了,当别人继承或重写这个属性的时候,它也有个abc这个属性,它的写法会把之前的给覆盖掉,这个是我们不想要的一个结果;
——对象中有用到symbol做key值,通过for in或者let of都是拿不到它的属性的;
-
Object.getOwnPropertySymbols(obj)
——能拿到symbol作为key值的一个对象的属性; -
Reflect.ownKeys(obj)
——返回的结果包含了symbol的变量作为key值的一个属性,也包含非symbol变量的一个属性;
{
let a1 = Symbol.for('abc');
let obj = {
[a1]:'123',
'abc':345,
'c':456
};
console.log('obj',obj);
//Object{
abc:345,
c:456,
Symbol(abc):"123"
}
for(let [key,value] of Object.entries(obj)){
console.log('let of',key,value);
//let of只拿到了abc和c这两个属性;Symbol(abc)这个属性没有拿到;
//let of abc 345
//let of c 456
}
Object.getOwnPropertySymbols(obj).forEach(function(item){
console.log(obj[item]);
//取到了a1变量这个值是123;
});
//取所有的key、value值,返回值是一个数组;用forEach遍历;
Reflect.ownKeys(obj).forEach(function(item){
console.log('ownKeys',item,obj[item]);
//ownKeys abc 345
//ownKeys c 456
//ownKeys Symbol(abc) 123
});
}
网友评论