JavaScript内置迭代器对象(如数组、字符串等)本身无next()方法,需通过Symbol.iterator获取迭代器实例后调用其next(),返回{value, done}对象,多次调用具有状态性。

JavaScript 中的内置迭代器对象(如数组、字符串、Map、Set 等)本身不直接暴露 next() 方法,但它们实现了 可迭代协议(iterable protocol),可通过 Symbol.iterator 获取一个迭代器对象,而这个迭代器对象才拥有 next() 方法。
获取并手动调用迭代器的 next()
要手动调用 next(),需先通过 [Symbol.iterator]() 得到迭代器实例,再在其上调用 next():
- 数组:
const it = [1, 2, 3][Symbol.iterator](); it.next(); // {value: 1, done: false} - 字符串:
const it = "hi"[Symbol.iterator](); it.next(); // {value: "h", done: false} - Map:
const it = new Map([[1,"a"]])[Symbol.iterator](); it.next(); // {value: [1, "a"], done: false} - Set:
const it = new Set([1])[Symbol.iterator](); it.next(); // {value: 1, done: false}
next() 的返回值结构
每次调用 next() 都返回一个对象,包含两个属性:
-
value:当前迭代项的值(最后一次调用后可能为
undefined) -
done:布尔值,
true表示迭代结束,false表示还有更多值
注意:多次调用 next() 是**状态化的**——迭代器会记住当前位置,不会重置。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
手动遍历的典型写法
可用循环反复调用 next() 直到 done 为 true:
const it = ["a", "b"][Symbol.iterator]();
let result;
while (!(result = it.next()).done) {
console.log(result.value); // "a", then "b"
}
这等价于 for...of 的底层行为,只是显式暴露了控制权。
不能直接在原对象上调用 next()
以下写法是错误的:
-
[1,2,3].next()→ 报错,数组没有next方法 -
"abc".next()→ 同样报错
必须先通过 Symbol.iterator 提取迭代器,再调用其 next()。这是可迭代对象与迭代器对象的职责分离设计。

















