ES6_9、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



symbol的内置值(属性)

除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行。也就是这些属性整体来作为某个对象的属性,来扩展这个属性的功能的。比如:数组Array对象就使用了symbol的属Symbol.iterator来作为它的一个属性。以便于for in 等遍历操作。

Symbol.hasInstance: 当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法

Symbol.isConcatSpreadable: 对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于 Array.prototype.concat()时,是否可以展开。

Symbol.species: 创建衍生对象时,会使用该属性。

Symbol.match: 当执行 str.match(myObject) 时,如果该属性存在,会调用它,返回该方法的返回值。

Symbol.replace: 当该对象被 str.replace(myObject)方法调用时,会返回该方法的返回值。

Symbol.search: 当该对象被 str.search (myObject)方法调用时,会返回该方法的返回值。

Symbol.split: 当该对象被 str.split(myObject)方法调用时,会返回该方法的返回值。

Symbol.iterator: 对象进行 for...of 循环时,会调用 Symbol.iterator 方法,返回该对象的默认遍历器。

Symbol.toPrimitive: 该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。

Symbol. toStringTag: 在该对象上面调用 toString 方法时,返回该方法的返回值。

Symbol. unscopables: 该对象指定了使用 with 关键字时,哪些属性会被 with环境排除。

比如:Symbol.hasInstance

如果调用instanceof的时候会默认调用Symbol.hasInstance

         class Person{
             static [Symbol.hasInstance](param){
                 console.log(param);
                 console.log("我被用来作类型检测了");

             }
         }

         let a=123;

         console.log(a instanceof Person);

o instanceof Person 判断o是不是person的实例的同时调用了我们写的[Symbol.hasInstance],就相当于是重写instanceof方法

posted @ 2022-03-17 11:50  青仙  阅读(44)  评论(0编辑  收藏  举报