javascript中实现无限数字序列的核心是返回符合迭代器协议的对象,其next()方法持续返回{value, done: false};推荐用generator函数(function* + yield)实现,也可手写带闭包的迭代器对象,并需由调用方主动控制消费以避免死循环。

JavaScript 中 Iterator 实现无限数字序列的按需生成,核心是返回一个符合迭代器协议的对象:它必须有 next() 方法,每次调用返回 { value, done } 形式的对象;done: false 表示可继续迭代,value 是当前产出的值。无限序列的关键在于 next() 不设终止条件,只靠调用方控制何时停止。
用 generator 函数最简洁(推荐)
Generator 函数天然支持暂停/恢复和按需产出,写无限序列非常直观:
- 用
function*定义,内部用yield逐个返回值 - 不写
return或让循环永真(如while(true)),就能无限产出 - 调用后返回一个迭代器对象,可直接用于
for...of、展开运算符或手动调用next()
例如生成从 0 开始的自然数序列:
function* naturals() {
let i = 0;
while (true) yield i++;
}
<p>const iter = naturals();
console.log(iter.next().value); // 0
console.log(iter.next().value); // 1
console.log([...iter].slice(0, 5)); // [2, 3, 4, 5, 6] —— 注意:已消耗前两个值</p>
手动实现迭代器对象(理解底层)
如果不依赖 generator,可以手写一个带闭包状态的迭代器对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用闭包保存当前计数值,避免暴露状态到外部
-
next()每次更新并返回新值,done始终为false - 可选地添加
[Symbol.iterator]() { return this; }支持 for...of
示例:
const infiniteCounter = {
[Symbol.iterator]() {
let current = 0;
return {
next() {
return { value: current++, done: false };
}
};
}
};
<p>// 使用
for (const n of infiniteCounter) {
if (n > 3) break;
console.log(n); // 0, 1, 2, 3
}</p>
控制消费,避免无限循环
无限迭代器本身不会自动停止,必须由使用者主动截断,否则会卡死:
-
for...of必须配合break、return或条件判断 - 用
Array.from()或展开运算符时,务必限制长度,例如Array.from({ length: 10 }, (_, i) => iter.next().value) - 可封装成带上限的辅助函数,如
take(iter, n)返回前 n 项数组
扩展:带参数的无限序列(如等差、等比)
只需把起始值、步长等作为参数传入 generator 或闭包:
function* range(start = 0, step = 1) {
let current = start;
while (true) {
yield current;
current += step;
}
}
<p>const evens = range(0, 2);
console.log(evens.next().value); // 0
console.log(evens.next().value); // 2
console.log(evens.next().value); // 4</p>
这样就能灵活生成任意线性递推的无限序列。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










