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]());

 

posted @ 2021-11-28 23:33  翟莹萍  阅读(103)  评论(0编辑  收藏  举报