Array.prototype[Symbol.iterator]是访问器属性,必须绑定数组实例才能调用;手动调用next()可控制迭代过程,返回{value, done}对象,迭代器不可重用,需重新获取。
![如何用 array.prototype[symbol.iterator] 手动获取迭代器](https://img.php.cn/upload/article/001/242/473/177511968459651.png?x-oss-process=image/resize,p_40)
直接调用 Array.prototype[Symbol.iterator] 会报错
这不是一个可直接执行的函数,而是一个**访问器属性(getter)**。你不能写 Array.prototype[Symbol.iterator]() —— 浏览器会抛出 TypeError: Illegal invocation,因为它的 this 必须绑定到具体数组实例上。
正确做法是:先从某个数组实例上取到迭代器函数,再调用它。
-
const arr = [1, 2, 3]; const iterator = arr[Symbol.iterator]();✅ -
const iterator = Array.prototype[Symbol.iterator].call(arr);✅(显式绑定 this) -
Array.prototype[Symbol.iterator]()❌(this 指向 undefined)
手动调用 next() 获取值的完整流程
拿到迭代器对象后,每次调用 next() 返回一个形如 { value: ..., done: true|false } 的对象。数组迭代器按索引顺序返回元素,直到越界后 done 变为 true。
const arr = ['a', 'b', 'c'];
const it = arr[Symbol.iterator]();
console.log(it.next()); // { value: 'a', done: false }
console.log(it.next()); // { value: 'b', done: false }
console.log(it.next()); // { value: 'c', done: false }
console.log(it.next()); // { value: undefined, done: true }
console.log(it.next()); // { value: undefined, done: true }(后续始终如此)
注意:value 在 done: true 后仍为 undefined,不是报错或抛异常。
为什么不用 for...of 而要手动调用?
手动控制迭代器适用于需要中断、跳过、复用或与异步逻辑交织的场景。比如:
- 实现自定义
take(2)只取前两个元素 - 在 while 循环中配合
await处理每个值(如逐个上传文件) - 调试时单步观察迭代状态
- 把数组迭代器传给接收
Iterator的第三方函数(如某些流式处理库)
此时你必须显式调用 next(),而不是依赖语言自动遍历。
Array.prototype[Symbol.iterator] 返回的迭代器不可重用
同一个迭代器对象只能单向消耗一次。一旦走到 done: true,再调用 next() 不会重置或重启。
如果需要重新迭代,必须重新获取一个新的迭代器:
-
const it1 = arr[Symbol.iterator]();→ 消耗完 -
const it2 = arr[Symbol.iterator]();→ 新的、未消耗的迭代器 - 不能写
it1[Symbol.iterator]()—— 数组迭代器本身不实现[Symbol.iterator]
这点和 GeneratorFunction 返回的迭代器行为一致,但容易被当成“可 reset”对象误用。










