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
评论区