可利用 symbol.iterator 实现惰性求值的无限数值序列生成器,如 infiniterange 类通过闭包维护当前值,next() 按需计算并返回 {value, done: false},支持 for...of 和组合操作(如 take、takewhile),状态私有、无副作用、纯函数式推进。

可以利用 Symbol.iterator 实现一个惰性求值、内存友好的无限数值序列生成器,核心是返回一个符合迭代协议的对象(即具有 [Symbol.iterator]() 方法,该方法返回一个带 next() 的迭代器对象),且 next() 按需计算下一个值,不预先生成整个序列。
定义可迭代的无限序列类
以等差数列为例:从起始值 start 开始,每次加 step,永不结束。关键在于让实例自身可被 for...of、展开运算符或 Array.from()(配合终止条件)消费。
- 类的
[Symbol.iterator]()方法必须返回一个**迭代器对象**(含next()方法) -
next()返回{ value, done };done: false表示持续产出,done: true才停止(无限序列通常永不失效) - 内部状态(如当前值)应封装在闭包或实例属性中,保证每次调用
next()独立推进
实现一个通用的无限步进生成器
下面是一个简洁可靠的实现:
class InfiniteRange {
constructor(start = 0, step = 1) {
this.start = start;
this.step = step;
}
[Symbol.iterator]() {
let current = this.start;
return {
next: () => {
const value = current;
current += this.step;
return { value, done: false };
}
};
}
}
使用示例:
const evens = new InfiniteRange(0, 2);
// 取前 5 个偶数
for (const n of evens) {
if (n >= 10) break;
console.log(n); // 0, 2, 4, 6, 8
}
// 或配合 Array.from + 数量控制
console.log(Array.from({ length: 5 }, (_, i) => evens[i]));
// ❌ 不行 —— evens 不支持索引访问;正确方式是用迭代器手动取:
const iter = evens[Symbol.iterator]();
console.log(Array.from({ length: 5 }, () => iter.next().value)); // [0, 2, 4, 6, 8]
支持终止条件与组合操作的增强写法
纯无限迭代器无法直接用于 Array.from(evens)(会卡死),因此实用中常搭配「取前 N 项」或「满足某条件时停止」的辅助函数:
- 封装
take(n):返回仅产出前n项的新可迭代对象 - 封装
takeWhile(predicate):持续产出直到predicate(value) === false - 这些封装本身也返回带
[Symbol.iterator]的对象,保持可组合性
例如 take 实现:
function take(iterable, n) {
const it = iterable[Symbol.iterator]();
return {
[Symbol.iterator]() {
let count = 0;
return {
next() {
if (count >= n) return { value: undefined, done: true };
const res = it.next();
count++;
return res;
}
};
}
};
}
// 使用
const firstTenOdds = take(new InfiniteRange(1, 2), 10);
console.log([...firstTenOdds]); // [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
扩展:支持其他数值模式(斐波那契、质数、几何级数)
只要把生成逻辑移到 next() 内部,就能适配任意规则:
- 斐波那契:维护
a和b,每次返回a并更新为[b, a + b] - 质数:用试除法或埃氏筛思想,在
next()中找到下一个质数(适合低频消费) - 几何序列:
current *= ratio,注意浮点精度与溢出
关键是:所有状态私有化、无副作用、每次 next() 纯函数式推进——这是无限流稳定、可复用的基础。










