1、ES5对象属性名都是字符串容易造成属性名的冲突。
var a = { name: 'lucy'};
a.name = 'lili'; // 这样就会重写属性
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。
重新复习下新知识:基本数据类型有6种:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
这里新添加了一种:Symbol
注意,Symbol
函数前不能使用new
命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象
Symbol
函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2 // false
Symbol值不能与其他类型的值进行运算
拓展,对象的属性名,属性值
var o = {a: "1"}
for(var p in o){
console.log("属性名:" + p); // 属性名 a
console.log("属性值:" + o[p]); // 属性值 1
}
如何使用,什么情况下使用
a、消除直接的 == 比较
一般我们写代码都是
if(name == "Tom"){
xxxx
}else if(name == "Laly"){
xxxx
}
但是这种代码很不雅观,也很难维护,此时就可以用Symbol变量了
const nameList = {
Tom: Symbol(),
Laly: Symbol()
}
if(name == nameList.Tom){
xxxx
}else if (name == nameList.Laly){
xxxx
}
b、消除一个对象有多个属性时候覆盖的问题,当一个对象有很多个属性的时候,太多人开发的时候就可能会被覆盖,那么就可以用Symbol优化
const name = Symbol("name")
const age = Symbol("age")
const obj = {
[name]: "张三",
[age]: "14"
}
c、使用Symbol来替代常量
我们经常定义一组常量来代表一种业务逻辑下的几个不同类型,我们通常希望这几个常量之间是唯一的关系,为了保证这一点,我们需要为常量赋一个唯一的值。
比如如下的’AUDIO’、‘VIDEO’、 ‘IMAGE’
const TYPE_AUDIO = 'AUDIO'
const TYPE_VIDEO = 'VIDEO'
const TYPE_IMAGE = 'IMAGE'
function handleFileResource(resource) {
switch(resource.type) {
case TYPE_AUDIO:
playAudio(resource)
break
case TYPE_VIDEO:
playVideo(resource)
break
case TYPE_IMAGE:
previewImage(resource)
break
default:
throw new Error('Unknown type of resource')
}
}
在使用Symbol定义常量以后就会相当方便
const TYPE_AUDIO = Symbol()
const TYPE_VIDEO = Symbol()
const TYPE_IMAGE = Symbol()
这样可以直接保证三个常量的值是唯一的。