Symbol.iterator
用来为对象指定 迭代器,使对象成为 可迭代对象。
只有 可迭代对象 才能被 for ... in
和扩展运算符 ...
等遍历取值。
const iterable = [];
iterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
}
console.log([...iterable]) // [1, 2]
在上面的例子中,iterable
变量本身是个数组,数组本身其实已经实现了可迭代协议,但是我们重写了它的迭代器,这就导致,即使它本来是个空数组,我们依然能够取出两个值来。由此看来,数组的遍历结果,是由它的迭代器决定的。
下面类的对象原型都实现了可迭代协议:
Array.prototype[Symbol.iterator]()
TypedArray.prototype[Symbol.iterator]()
String.prototype[Symbol.iterator]()
Map.prototype[Symbol.iterator]()
Set.prototype[Symbol.iterator]()
注意,在某些地方(包括 MDN),会使用 @@iterator
来表示 Symbol.iterator
。
更一般的,使用 @@
来表示 Symbol.
。
👎 如果一个可迭代对象的 @@iterator
方法没有返回 迭代器,这样的迭代是不好的(non-well-formed),它可能在程序运行时产生意料之外的异常。
Reference
👉 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator
评论区