1.es6引入Symbol数据类型的原因
ES5 的对象属性名都是字符串,容易造成属性名的冲突。而es6引入的Symbol数据类型可以保证每个属性的名字都是独一无二的,这样就从根本上防止属性名的冲突。
let s5 = Symbol('abc');
let s6 = Symbol('abc');
console.log(s5 === s6);//输出:false,即独一无二
//创建两个空的symbol变量也不恒等
let k1=Symbol();
let k2=Symbol();
console.log(k1===k2);//输出:false
2.对象的属性名可能存在两种类型
(1)直接是字符串
(2)symbol类型的名称
3.通过symbol函数产生变量
let s1 = Symbol();
let s2 = Symbol();
console.log(typeof s1);//输出:symbol
4.将string类型转化为symbol类型
let s3 = Symbol(str);
console.log(s3);//Symbol(abc)
如果symbol函数的参数不是字符串,会默认执行toString()方法来获取字符串
let obj = {
name: '男男女女',
toString() {
return this.name;
}
}
console.log(obj.toString());//obj直接转字符串
let s4 = Symbol(obj);//使用symbol
console.log(s4);//输出:Symbol(男男女女)
5.symbol变量直接转化字符串
let s7 = Symbol('abc');
console.log(s7.toString());
console.log(String(s7));
console.log(s7.description); //使用description直接获取字符串值
6.symbol变量作为对象的属性
let aa=Symbol();
let objstu={
[aa]:'aaa'
}
console.log(objstu);
console.log(objstu[aa]);//输出:undefined
7.使用同一个symbol值
let k2=Symbol.for('abc');
let k3=Symbol.for('abc');
console.log(k2===k3);//输出:true
let k6=Symbol.for('kkkk');
let k8=Symbol.for('mmmm');
console.log(k6===k8);//输出:false
8.获取登记过的symbol变量值
let k4=Symbol('abc');
let k5=Symbol.for('abc');
console.log(Symbol.keyFor(k4));//输出:undefined,直接生成一个对应的symbol变量
console.log(Symbol.keyFor(k5));//输出:abc,返回key的原始字符串