ES6-ES11(Day8)

38 阅读2分钟

ES6-Symbol的介绍与创建

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

Symbol特点

1、Symbol值是唯一的,用来解决命名冲突的问题

2、Symbol值不能与其他数据进行运算

let r1 = s + 100;

let r2 = s > 100; 

let r3 = s + "100";

let r4 = s + s; 

 // 结果:均报错

3、Symbol定义的对象属性不能使用for…in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名

JS的数据类型

1、undefined

2、String

3、Symbol

4、Object

5、null

6、Number

7、Boolean

ES6-对象添加Symbol类型的属性的两种方式

方法一

     let game = {};

     // 声明一个对象

     let methods = {

       up: Symbol(),

       down: Symbol(),

     };

     //   给game对象扩展方法

     game[methods.up] = function () {

       console.log("改变形状");

     };

     game[methods.down] = function () {

       console.log("快速下降");

     };

     console.log(game);

     //结果:{Symbol(): ƒ, Symbol(): ƒ}

方式二

注: 不能直接在对象内将symbol作为关键字

     let games = {

       name: "狼人杀",

       [Symbol("say")]: function () {

         console.log("我可以发言");

       },

       [Symbol("boom")]: function () {

         console.log("我可以自爆");

       },

     };

     console.log(games);

     //结果:{name: '狼人杀', Symbol(say): ƒ, Symbol(boom): ƒ}

ES6-Symbol的内置属性

除了定义自己使用的Symbol值以外。ES6还提供了11个内置的Symbol值(Symbol的内置属性),指向语言内部使用的方法,用于扩展对象功能

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

      class Person {

        static Symbol.hasInstance {

          console.log("Person  params", param);

          console.log("我被用来检测类型了");

        }

      }

      let o = {};

      console.log(o instanceof Person);

      //   结果:Person  params {}

      //        我被用来检测类型了

      //        false

**Symbol.isConcatSpreadable: **对象的Symbol.isConcatSpreadable属性结果为一个布尔值,表示该对象用于Array.prototype.concat()进行数组合并时,结果是否可以展开

      const arr = [1, 2, 3, 4];

      const arr1 = [5, 6, 7, 8];

      arr1[Symbol.isConcatSpreadable] = false;

      console.log(arr.concat(arr1));

      //   结果:(5) [1, 2, 3, 4, Array(4)]

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

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.toPrimitive: 该对象被转换为原始数据类型时会调用该方法,返回该对象对应的原始数据类型

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

Symbol.species: 创建衍生对象时,会调用该方法