- Symbol 是 ES6 中引入的新类型,它是一切非字符串的对象 key 的集合,在 ES6 规范中,整个对象系统被用 Symbol 重塑。\
- 后面会详细叙述 Symbol 跟对象系统。这里我们只介绍 Symbol 类型本身:它有哪些部分,它表示什么意思,以及如何创建 Symbol 类型。\
- Symbol 可以具有字符串类型的描述,但是即使描述相同,Symbol 也不相等。
我们创建 Symbol 的方式是使用全局的 Symbol 函数。例如:
var mySymbol = Symbol("my symbol")
一些标准中提到的 Symbol,可以在全局的 Symbol 函数的属性中找到。例如,我们可以使用 Symbol.iterator 来自定义 for…of 在对象上的行为:
var o = new Object
o[Symbol.iterator] = function(){
var v = 0
return {
next: function(){
return {value: v++, done: v > 10 }
}
}
}
for(var v of o)
console.log(v);// 0 1 2 3 ... 9
代码中我们定义了 iterator 之后,用 for(var v of o) 就可以调用这个函数,然后我们可以根据函数的行为,产生一个 for…of 的行为。
这里我们给对象 o 添加了 Symbol.iterator 属性,并且按照迭代器的要求定义了一个 0 到 10 的迭代器,之后我们就可以在 for of 中愉快地使用这个 o 对象啦。
这些标准中被称为“众所周知”的 Symbol,也构成了语言的一类接口形式。它们允许编写与语言结合更紧密的 API。
把Symbol作为对象,它提供了很多静态方法,是JS很多底层的实现原理出处
- Symbol.toPrimitive\ 覆盖原有行为(toString valueOf)默认先执行valueOf,然后是toString
- Symbol.hasInstance\
- Symbol.toStringTag\
- Symbol.iterator\自定义for...of行为
- Symbol.asyncIterator