ES6_Symbol


介绍

ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。

特点

1)Symbol 的值是唯一的,用来解决命名冲突的问题
2)Symbol 值不能与其他数据进行运算
3)Symbol 定义 的 对象属 性 不能 使 用 for…in 循 环遍 历 ,但是可以使用Reflect.ownKeys 来获取对象的所有键名。

Symbol.for方法会根据给定的键 key,来从运行时的 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入全局 symbol 注册表中。

使用:

1、创建symbol方式1

let s=Symbol();


symbol好比身份证号,参数是姓名,姓名可以重复,但身份证号不行
        let s2=Symbol("路飞");
        let s3=Symbol("路飞");
        console.log(s2===s3);//它们的返回结果是不一样的,就相当于它们参数都是路飞,但是编号不一样。

2、创建symbol方式2

          let s4= Symbol.for("ace");
          let s5= Symbol.for("ace");
          console.log(s4===s5);

这两种方式的区别:

通过这种方式可以通过描述字符串得到唯一的symbol的值,Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。它们的区别是,你调用30个Symbol会得到30个不一样的值,但是Symbol for 会得到一个相同的值。



对象添加symbol类型的属性

symbol就是用来创建全局唯一的值,多人协作时可以防止命名冲突。
为了防止你创建和方法和对象本身的方法冲突,选择在另一个对象中用symbol创建独一无二的方法,用[]调用,不会污染本身对象中的方法。

如:

①给game对象添加up down两个方法。

image

一般做法:

gamee.up=function(){};

这样做万一里面有up方法,不就把原来的覆盖了吗,所以i要用打开这个额对象看里面结构,万一结构复杂,还要看很久。效率低而且不安全。

正确方法:

声明一个对象,这样up和down肯定不会冲突。
image

然后再给game添加这个对象里的方法
image
调用:
game[methods.up]();


②将对象属性添加symbol类型的结果,这样也不会影响对象的方法

image

注: 遇到唯一性的场景时要想到 Symbol

ES6