JavaScript 迭代器本身不支持遍历步长,但可通过生成器函数封装实现;如 strideIterator(arr, step) 支持正负步长、边界处理,并可配合 Array.from 或扩展运算符使用,但为一次性消耗。

JavaScript 中的 Iterator 本身不直接支持“遍历步长”这个概念,因为标准迭代器(如 Symbol.iterator 返回的对象)每次调用 next() 都只返回一个值。但你可以通过封装逻辑,在生成迭代器时控制“跳过多少项”,从而实现自定义步长的效果。
用生成器函数实现带步长的迭代器
最常用且清晰的方式是使用 function* 生成器,手动控制每次 yield 的索引或元素。
- 遍历数组时,按指定步长(如每 2 个取 1 个)返回元素
- 注意边界处理:避免越界,尤其当步长大于数组长度时
- 可支持负步长(倒序),但需确保起始/终止条件合理
示例:
function* strideIterator(arr, step = 1) {if (step === 0) throw new Error("Step cannot be zero");
for (let i = 0; i yield arr[i];
}
}
const nums = [0, 1, 2, 3, 4, 5, 6];
for (const n of strideIterator(nums, 2)) {
console.log(n); // 输出 0, 2, 4, 6
}
为任意可迭代对象添加步长能力
如果想让任何实现了 Symbol.iterator 的对象(如 Set、Map、字符串)也能按步长遍历,可以写一个通用包装函数。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 先获取原始迭代器,再用内部计数器决定是否 yield
- 适合处理无限迭代器(如自定义的自然数生成器),只需在满足步长条件时才返回
- 注意:不能提前知道总长度,所以无法做“末尾对齐”优化
示例:
function* withStride(iterable, step) {const it = iterable[Symbol.iterator]();
let i = 0;
while (true) {
const { value, done } = it.next();
if (done) break;
if (i % step === 0) yield value;
i++;
}
}
[..."hello"].forEach((c, i) => console.log(i, c)); // 0:h, 1:e...
for (const c of withStride("hello", 2)) {
console.log(c); // h, l, o
}
配合 Array.from 或扩展运算符使用
自定义步长迭代器可直接用于 Array.from、解构或 [...iter],但要注意它仍是一次性消耗的。
-
Array.from(strideIterator([1,2,3,4,5], 2))→[1, 3, 5] - 若需多次使用,应重新调用生成器函数,而非复用同一个迭代器对象
- 避免误把步长当成“跳过前 N 项”,那是
skip(n)的语义,和步长不同
常见误区提醒
不要试图修改原生迭代器的 next() 行为来“注入”步长逻辑——它不可逆、不可配置。真正的步长必须由你控制迭代节奏,而不是靠拦截。
- 步长为 1 是默认行为,无需特殊处理
- 步长为负数时,需明确方向(如从后往前),建议单独封装
strideBackward更安全 - 性能敏感场景下,避免在每次
next()中做复杂计算,把逻辑尽量前置

















