Symbol表示独一无二的值。
创建Symbol对象的方法

  • 直接Symbol
  • 使用Symbol.for()

    Symbol直接创建对象

    1. let sy1 = Symbol("a")
    2. let sy2 = Symbol("a")
    3. console.log(sy1 === sy2) //false
    4. console.log(sy1.toString() === sy2.toString()) // true
    5. // Es2019提供新属性description
    6. console.log(sy1.description === sy2.description) // true

    Symbol.for()创建对象

    1. let s1 = Symbol.for("foo")
    2. let s2 = Symbol.for("foo")
    3. console.log(s1 === s2) //true
    这两种方法的对比:
    相同点:都会生成Symbol
    不同点:Symbol.for()创建出来会被记录在全局环境中,之后在使用Symbol.for()创建会先检查给定的key是否已经存在,如果不存在才会新建一个值。比如,调用Symbol.for(“foo”)10次,返回相同的值。但是Symbol(“foo”)30次,会返回30个不同的Symbol。

    Symbol.iterator

    对象的Symbol.iterator属性,指向该对象的默认遍历器方法。
    1. const myIterable = {}
    2. myIterable[Symbol.iterator] = function* (){
    3. yield 1;
    4. yield 2;
    5. yield 3;
    6. };
    7. [...myIterable] // [1,2,3]
    对象进行for…of循环时,会调用Symbol.iterator方法,返回该对象的默认遍利器

    Symbol.toStringTag

    Symbol对象的toStringTag属性,指向一个方法。在该方法上面调用Object.prototype.toString方法时,如果toStringTag属性存在,它的返回值会出现在toString方法返回的字符串中,表示对象的类型。这个类型是[object Object] 或[object Array]中object后面的字符 ```javascript ({[Symbol.toStringTag]: ‘Foo’}.toString()) // “[object Foo]”

class Collection { get Symbol.toStringTag { return ‘self-define’; } } let x = new Collection(); Object.prototype.toString.call(x) // “[object self-define]”

```