javaScript的数据类型:number,string,boolean,undefined,null,object
ES6带来了一个新的数据类型:symbol
目的是:解决对象的属性名冲突的问题。
let sm1=Symbol();
let sm2=Symbol();
console.log(sm1); //Symbol()
console.log(sm2); //Symbol()
console.log(typeof sm1) //symbol
console.log(sm1===sm2) //false
从测试可以发现 虽然sm1和sm2看起来很一样,但他们其实是不相等的。为了让不同的Symbol看起来不一样,我们可以通过参数来实现:
let sm1=Symbol('sm1');
let sm2=Symbol('sm2');
console.log(sm1); //Symbol(sm1)
console.log(sm2); //Symbol(sm2)
参数就像是Symbol的描述,用来区分看起来相同,实则不同的Symbol,但要注意,即使描述相同,sm1和sm2也不同,毕竟他们本来就是不同的东西。
下面我们来看用Symbol解决对象属性命名冲突的注意问题:
(1)当symbol值作为对象的属性名时,不能用点号来取得对应的属性值。
let name=Symbol();
let person={
[name]:'Lily' //以Symbol作为属性名name
};
console.log(person[name]) //Lily
console.log(person.name) //undefined 不能用点号来取得对应的属性值
(2)当symbol值作为对象的属性名时,也不能用点号来设置对应的属性值
let name=Symbol();
let person={}
paseon.name='Lily' //以Symbol作为属性名name,以点号赋值。
console.log(person[name]) //undefined 不能用点号来设置对应的属性值
console.log(person['name']) //Lily
console.log(person.name) //Lily
可以看出,当用点号赋值时,其实javascript就不会把点号后的值理解为symbol类型,而是字符串类型,就相当于没有使用symbol
(3)如何遍历symbol类型的属性名:Object.getOwnPropertySymbols()
let name=Symbol();
let person={
[name]:'Lily' , //symbol类型
'age':12 //string类型
};
Object.keys(person) //['age']
for(let key in person){
console.log(key) // age
}
我们发现使用Object.keys()和for...in都无法遍历出symbol类型的属性。
我们可以用Object.getOwnPropertySymbols()来获取symbol类型的属性:
Object.getOwnPropertySymbols(person) // [Symbol(name)]
(4)获取对象上的所有属性名:Reflect.ownKeys()
Reflect.ownKeys(person) // ['age',Symbol(name)]
(5)用Symbol.for()创建全局变量
let sm1=Symbol.for('name');
let sm2=Symbol.for('name');
之前我们说过,在用Symbol创建变量时,即使描述相同,两个变量实际也是不同的(console.log(sm1===sm2) //false )。
但这里,我们用Symbol.for()来创建得到的结果是:
console.log(sm1===sm2) //true
原因是:使用Symbol.for()来创建的symbol值被登记在全局环境中,以便用Symbol.for()来搜索。也就是使用Symbol创建的symbol值是无法用Symbol.for()来搜索的。
let sm1=Symbol('name');
let sm2=Symbol.for('name');
console.log(sm1===sm2) //false
(6)Symbol.keyFor() 返回一个被登记在全局环境中的symbol值的key,没有返回undefined
let sm1=Symbol.for('name');
Symbol.keyFor('sm1') //name
let sm1=Symbol('name');
Symbol.keyFor('sm1') // undefined