基础

Symbol是ES6引入的一种新的原始数据类型,表示独一无二的值。在此之前JavaScript中有六种数据类型(Number, String, Boolean, undefined, null, Object),这是第七种;

创建方式:let sym = Symbol(), 可以接收参数作为描述,一般为字符串;即使是传入相同的字符串,Symbol值本身都是独一无二的;

      let s = Symbol("name");
      let s1 = Symbol(3);
      alert(typeof s); // symbol
      alert(s); // trysomething.html:11 Uncaught TypeError: Cannot convert a Symbol value to a string
      console.log(s); // Symbol(name)
      console.log(s1); //  Symbol(3)

可以通过String()/toString()/Boolean()方法对其转换类型,但是不能直接将Symbol值用于运算(如字符拼接、数学计算等),也不能用Number()转换为数值,会报错;

      console.log(s1+2); //Uncaught TypeError: Cannot convert a Symbol value to a number
      console.log(Number(s1)+2); //Uncaught TypeError: Cannot convert a Symbol value to a number
      console.log(String(s1)+2); //Symbol(3)2
      console.log(Boolean(s1)+2); //3

只要被创建且为更改为其他类型,所有Symbol值转换为Boolean值都是true;

Symbol值作为对象的属性名,必须放在方括号之中,不能用点操作符;该属性是公开属性;

Symbol属性名的遍历

Object.getOwnPropertySymbols()方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。

Symbol.for(), Symbol.keyFor()

Symbol.for()接受一个字符串作为参数,如果已经有以该字符串命名的Symbol值就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。只有Symbol.for()创建的值可以被登记于全局并供之后的Symbol.for()搜索,而Symbol()创建的值一定是独一无二的值;

    let a = Symbol("time");
    let b = Symbol.for("time");
    let c = Symbol.for("time");
    console.log(a === b); // false
    console.log(c === b); // true

Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key

内置的Symbol值

(感觉这部分需要用起来才能理解和记忆,先保留大概印象,需要时再去教程中复习)
ES6定义了11个内置的Symbol值,指向语言内部使用的方法;

  1. 对象的Symbol.hasInstance属性,指向一个内部方法,当其他对象调用instanceof运算符,判断是否为该对象的实例时,会调用这个方法;
  2. 对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。
  3. 对象的Symbol.species属性,指向一个构造函数。创建衍生对象时,会使用该属性。
  4. 对象的Symbol.match属性,指向一个函数。当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值。
  5. 对象的Symbol.replace属性,指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值。
  6. 对象的Symbol.search属性,指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值。
  7. 对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值。
  8. 对象的Symbol.iterator属性,指向该对象的默认遍历器方法。
  9. 对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
  10. 对象的Symbol.toStringTag属性,指向一个方法。在该对象上面调用Object.prototype.toString方法时,如果这个属性存在,它的返回值会出现在toString方法返回的字符串之中,表示对象的类型。也就是说,这个属性可以用来定制[object Object][object Array]object后面的那个字符串。
  11. 对象的Symbol.unscopables属性,指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除。

 posted on 2018-06-18 21:23  木汀  阅读(118)  评论(0编辑  收藏  举报