javascript中可通过实现symbol.iterator方法创建自定义数字范围迭代器,核心是返回含next()方法的对象,每次调用返回{value, done};支持步长与方向,需确保每次[symbol.iterator]返回新实例以实现多次遍历。

JavaScript 中可以通过实现 Symbol.iterator 方法,让对象支持 for...of 循环,从而创建自定义范围数字的迭代器。核心是返回一个具有 next() 方法的对象,该方法每次调用返回 { value, done } 形式的对象。
基础实现:从 start 到 end(含)的整数迭代器
最简方式是封装一个类,内部维护当前值和边界,在 next() 中递增并判断是否越界:
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
<p>[Symbol.iterator]() {
let current = this.start;
const { end } = this;</p><pre class="brush:php;toolbar:false;">return {
next() {
if (current <p>}
}</p><p>// 使用示例
for (const num of new Range(2, 5)) {
console.log(num); // 2, 3, 4, 5
}</p>支持步长(step)和方向的增强版
实际中常需指定步长,甚至支持递减(如从 10 到 1)。关键在于把 current 的更新逻辑与终止条件统一为比较关系:
- 用
step > 0判断是递增还是递减循环 - 终止条件改为
(step > 0 ? current = end) -
next()中先返回当前值,再按 step 更新
class Range {
constructor(start, end, step = 1) {
this.start = start;
this.end = end;
this.step = step;
}
<p>[Symbol.iterator]() {
let current = this.start;
const { end, step } = this;</p><pre class="brush:php;toolbar:false;">return {
next() {
if ((step > 0 && current = end)) {
const value = current;
current += step;
return { value, done: false };
} else {
return { value: undefined, done: true };
}
}
};} }
// 示例:偶数、倒序、负步长 console.log([...new Range(0, 8, 2)]); // [0, 2, 4, 6, 8] console.log([...new Range(5, 1, -1)]); // [5, 4, 3, 2, 1]
兼容性与可复用技巧
迭代器对象本身应是**可多次遍历**的(比如能多次展开成数组),因此 [Symbol.iterator] 必须每次返回**新迭代器实例**,不能复用内部状态。上面写法已满足这点。
- 避免在类属性中存
current,它属于每次迭代的私有状态 - 若需惰性求值或配合生成器,也可用
function*简化(但本质仍是返回迭代器):function* range(start, end, step = 1) { ... yield ... } - 注意浮点数步长可能导致精度问题,生产环境建议校验或转整数处理
一行函数式写法(适合简单场景)
如果只是临时用,也可以直接返回迭代器对象,不封装类:
const range = (start, end, step = 1) => ({
[Symbol.iterator]() {
let current = start;
return {
next() {
if ((step > 0 ? current = end)) {
const val = current;
current += step;
return { value: val, done: false };
}
return { done: true };
}
};
}
});
<p>console.log([...range(3, 7)]); // [3, 4, 5, 6, 7]</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











