ES6 14.Symbol类型和属性
要点:1.Symbol类型 2.Symbol属性
一.Symbol类型
1.ES6之前基础数据类型:字符串、数组、布尔、对象、null、undefined;
2.ES6新增了一种叫做Symbol的基础数据类型,表示独一无二的值,类似id
3.创建Symbol通过函数Symbol()完整,可以传递参数,也可以为空
// 注意,不支持new Symbol() let s=Symbol(); console.log(s); //输出Symbol() console.log(typeof s); //输出symboll类型
4.在Symbol()函数中参数,是对变量的描述,程序无法访问,只能日志打印
// 为了输出测试时,便于区分 let s=Symbol('s!');
5.创建两个Symbol类型的变量,来验证他们独一无二的特性
// 有没有参数,或参数是否相同都不恒等 // 因为Symbol是唯一存在的 let s1=Symbol(), s2=Symbol(); console.log(s1===s2); //false
6.Symbol类型变量无法进行隐式转换,需要提前显示转换匹配的类型
// Symbol类型无法隐式转换,可显示 let s=Symbol(); console.log(s.toString()+'变量'); console.log(String(s)+'变量'); console.log(!s); //布尔值
二.Symbol属性
1.Symbol类型有哪些应用场景?解决哪些问题?最常用的一种就是对象属性
2.由于Symbol类型是独一无二的值,作为对象属性就具有唯一性不出现重名
3.对于多个模块、多人开发或者拼装属性名的情况下,有可能会出现属性名重复
4.首先,故意设置一个相同的对象属性名,看看会出现什么问题
let obj={ name:'Mr.Lee', name:'Mr.Wang' //被替代 } console.log(obj); let x='name', y='name'; let obj={ ['user' +x]:'Mr.Lee', ['user' +y]:'Mr.Wang', } console.log(obj);
5.那么,Symbol作为对象属性名,该如何使用
let name=Symbol('name'); let obj={ [name]:'Mr.Lee' } console.log(obj); //结果:{ [Symbol(name)]: 'Mr.Lee' }
6.强调:上面例子属性名不是name,而是[Symbol(name)];
7.其中,参数name,要不要都无所谓,主要是为了看上去清晰
let x =Symbol('name'); let y=Symbol('name'); let obj={ [x]:'Mr.Lee', [y]:'Mr.Wang', } console.log(obj); //结果:{ [Symbol(name)]: 'Mr.Lee', [Symbol(name)]: 'Mr.Wang' } console.log(obj[x]);
8.方法名也可以使用Symbol类型
let fn=Symbol('fn'); let obj={ [fn](){ return 'fn'; } }; console.log(obj); console.log(obj[fn]());