JS中数组可通过Symbol.iterator获取迭代器对象并手动调用next()遍历,返回{value, done}对象,done为true时遍历结束且不可重置,需重新获取迭代器。

JS 中可以用数组的 Symbol.iterator 方法获取迭代器对象,再通过反复调用 next() 手动控制遍历过程。
获取数组的迭代器对象
每个数组都有内置的 Symbol.iterator 方法,调用它会返回一个迭代器(Iterator)对象:
- 这个对象有 next() 方法,每次调用都返回一个形如
{ value: ..., done: true/false }的对象 -
done: true表示遍历结束,之后再调用next()仍返回{ value: undefined, done: true } - 数组的迭代器按索引顺序逐个返回元素值
手动调用 next() 遍历
示例代码:
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 }(后续始终如此)
用 while 循环模拟 for...of 行为
可以封装成更实用的手动遍历结构:
const arr = [10, 20, 30];
const iterator = arr[Symbol.iterator]();
let result = iterator.next();
while (!result.done) {
console.log(result.value); // 输出 10, 20, 30
result = iterator.next();
}
注意点和常见误区
- 迭代器是一次性消耗品:一旦遍历到
done: true,无法自动重置;需重新调用[Symbol.iterator]()获取新迭代器 -
for...of内部就是这么工作的,只是语法糖,它自动调用next()并检查done - 不能直接对普通对象使用
[Symbol.iterator],除非手动部署该方法











