Symbol表示独一无二的值。
创建Symbol对象的方法
- 直接Symbol
- 使用Symbol.for()
Symbol直接创建对象
let sy1 = Symbol("a")
let sy2 = Symbol("a")
console.log(sy1 === sy2) //false
console.log(sy1.toString() === sy2.toString()) // true
// Es2019提供新属性description
console.log(sy1.description === sy2.description) // true
Symbol.for()创建对象
这两种方法的对比:let s1 = Symbol.for("foo")
let s2 = Symbol.for("foo")
console.log(s1 === s2) //true
相同点:都会生成Symbol
不同点:Symbol.for()创建出来会被记录在全局环境中,之后在使用Symbol.for()创建会先检查给定的key是否已经存在,如果不存在才会新建一个值。比如,调用Symbol.for(“foo”)10次,返回相同的值。但是Symbol(“foo”)30次,会返回30个不同的Symbol。Symbol.iterator
对象的Symbol.iterator属性,指向该对象的默认遍历器方法。
对象进行for…of循环时,会调用Symbol.iterator方法,返回该对象的默认遍利器const myIterable = {}
myIterable[Symbol.iterator] = function* (){
yield 1;
yield 2;
yield 3;
};
[...myIterable] // [1,2,3]
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]”
```