我们经常要用到使用唯一性变量的场景,以前都自己封装UUID了之类的函数来得到,ES6专门提供了一种数据类型Symbol来提供唯一性的值;
1 使用Symbol()函数获取Symbol变量
let a = Symbol();
console.log(typeof a);//symbol
let b = Symbol();
console.log(a==b,a===b);//false false
注意:Symbol() S虽然大写,但这只是个函数,获取Symbol变量时并未使用new关键字
2 使用Symbol.for(arg)在Symbol变量中混入自定义值
let a = Symbol.for('my');
let b = Symbol.for('my');
console.log(a==b,a===b);//true true
注意:不要因为a和b相等判断为true就认为这个值不是唯一性值了,而是因为Symbol.for(arg)函数会检测有没有与arg相关的Symbol类型,如果有就返回,如果没有才新建。所以上述代码中a和b本来就是指向了一个Symbol变量,当然相等了。
3 遍历Symbol属性,有对象如下
let a = Symbol.for('my');
let obj = {
[a]:'qiang',
age:18
}
- 使用let of遍历该对象是拿不到Symbol属性的。
for(let [key,value] of Object.entries(obj)){
console.log(key,value);
}
//age 18
- 使用Object.getOwnPropertySymbol(obj)可得到一个包含该对象所有Symbol类型属性的数组
Object.getOwnPropertySymbols(obj).forEach(function(item){
console.log(item,obj[item]);
})
//Symbol('my') qiang
- 使用Reflect.ownKeys(obj)可得到一个包含该对象所有属性的数组
Reflect.ownKeys(obj).forEach(function(item){
console.log(item,obj[item]);
})
//age 18
//Symbol('my') qiang
网友评论