← 中文资源

简体中文版本

带步长校验的数字区间生成器

生成包含起止边界的正步长或负步长数字区间,校验输入并通过生成器惰性产出大范围序列。

阅读英文原文

功能说明

循环生成数字序列时,步长为零、方向不一致和浮点误差容易造成死循环或空结果。range 返回包含起止边界的数组,rangeIter 以生成器惰性产出,适合处理大范围。步长为正时递增,为负时递减,方向与起止值不匹配时返回空序列。

关键代码

先统一校验三个参数为有限数字且步长非零,避免隐式类型转换。range 根据步长方向选择循环条件,逐步推进并写入数组;rangeIter 使用同样的条件逐个 yield。两者都不修改输入,生成器也不会预先分配整个序列。

if (step > 0) {
  for (let value = start; value <= end; value += step) result.push(value);
} else {
  for (let value = start; value >= end; value += step) result.push(value);
}

使用注意

使用普通浮点加法,0.1 这类步长可能出现 0.30000000000000004,需要整数或额外舍入。start 大于 end 且 step 为正时返回空数组,反向步长同理。步长为 0 会抛 RangeError,避免无限循环。生成器只能安全遍历一次。

验证方式

断言 range(1, 5) 返回 [1, 2, 3, 4, 5],range(5, 1, -2) 返回 [5, 3, 1],range(1, 2, 0) 抛 RangeError。用 for…of 展开 rangeIter(0, 4, 2) 应得到 [0, 2, 4]。传入 NaN 或字符串应抛 TypeError。