Symbol 的简单理解

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

这样可以直接保证三个常量的值是唯一的。

猜你喜欢

转载自blog.csdn.net/weixin_40918145/article/details/111370201