collection/range.jsjavascript
/**
 * 生成一个不包含终点的等差数列。
 * @function range
 * @memberof module:collection
 * @param {number} start 起点;仅传一个参数时该参数作为终点且起点为 0
 * @param {number} [end] 终点
 * @param {number} [step] 步长,省略时根据方向自动取 1 或 -1
 * @returns {number[]} 数列数组
 * @throws {TypeError|RangeError} 参数不是有限数值或步长为零时抛出
 */
function range(start = 0, end, step) {
  if (end === undefined) [start, end] = [0, start]
  if (![start, end].every(Number.isFinite)) throw new TypeError('start and end must be finite numbers')
  if (step === undefined) step = start < end ? 1 : -1
  if (!Number.isFinite(step) || step === 0) throw new RangeError('step must be a non-zero finite number')
  const result = []
  const ascending = step > 0
  for (let value = start; ascending ? value < end : value > end; value += step) result.push(value)
  return result
}

export default range