<p>JavaScript中创建无限序列迭代器的核心是next()方法按需返回{value, done: false},常用生成器函数(function* + yield)实现;也可手动实现Iterator接口,通过闭包维护状态;使用take等工具函数可安全取有限项,避免[...iter]导致卡死。</p>

JavaScript 中编写无限序列的迭代器,核心是让 next() 方法按需返回新值,不预先计算全部数据,也不终止(即始终返回 { value, done: false })。关键在于内部状态管理与惰性计算。
用生成器函数(Generator)最简洁实现
生成器天然支持暂停/恢复和按需产出,是创建无限迭代器的首选方式:
- 用
function*定义,内部用yield每次返回一个值 - 不写
return或确保不退出循环,就能保持done: false - 每次调用
iterator.next()才执行到下一个yield
例如:生成无限自然数序列
function* naturals() {
let i = 0;
while (true) {
yield i++;
}
}
<p>const iter = naturals();
console.log(iter.next()); // { value: 0, done: false }
console.log(iter.next()); // { value: 1, done: false }
console.log(iter.next()); // { value: 2, done: false }
// ……可无限继续手动实现 Iterator 接口(非生成器)
若需完全控制迭代器对象(比如兼容旧环境或封装复杂逻辑),可手动实现 [Symbol.iterator]() 和 next():
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 返回的对象必须有
next()方法,且该方法返回{ value, done } - 内部用闭包或实例属性保存当前状态(如计数器、种子值等)
-
done始终为false,表示永不结束
例如:手动实现斐波那契无限序列
function fibonacciIterator() {
let a = 0, b = 1;
return {
next() {
const value = a;
[a, b] = [b, a + b];
return { value, done: false };
},
[Symbol.iterator]() {
return this;
}
};
}
<p>const fib = fibonacciIterator();
console.log(fib.next()); // { value: 0, done: false }
console.log(fib.next()); // { value: 1, done: false }
console.log(fib.next()); // { value: 1, done: false }
console.log(fib.next()); // { value: 2, done: false }支持中断与重用的实用技巧
无限迭代器常需「取前 N 个」或「满足条件时停止」,建议配合以下模式使用:
- 用
for...of+break或return主动退出(引擎自动调用return(),但对无限迭代器非必需) - 封装成可限制长度的工具函数,如
take(iter, n)返回前n项数组 - 避免直接展开(
[...iter]),否则会卡死——这是常见错误
示例:安全取前 5 个自然数
function take(iter, n) {
const result = [];
for (let i = 0; i < n; i++) {
const { value } = iter.next();
result.push(value);
}
return result;
}
<p>const nums = naturals();
console.log(take(nums, 5)); // [0, 1, 2, 3, 4]注意边界与性能细节
无限迭代器看似简单,实际使用中需留意:
- 状态不能意外重置(比如多次调用
[Symbol.iterator]()应返回新迭代器,而非复用旧状态) - 数值类序列注意整数精度(JS 安全整数上限为
2^53 - 1) - 若涉及异步(如无限轮询),应改用
AsyncIterator(async function*) - 调试时可用
console.log在yield前打点,验证是否真惰性执行

















