我试图通过创建一个Range函数来理解JavaScript中的迭代器,但它不起作用

我正在try 理解JavaScript中的可迭代变量,因此我创建了一个Range函数,当我调用它时,它将为我返回一系列数字,例如:

for (let i of Range(5)) console.log(i);
0
1
2
3
4

以下是执行此操作的代码.

// log function
const log = console.log;

// Range constructor 
function Range(end, start, step = 1) {
    if (!new.target) {
        return new Range(start, end, step);
    }
    end = start ? start : end;
    start = start ? end : 0;
    step = step;
    
    return {
        start,
        end,
        step,
        [Symbol.iterator]() {
            return this;
        },
        next() {
            if (this.start < this.end) {
                this.start += this.step;
                return {
                    done: false,
                    value: this.start - this.step
                };
            } else {
                return { done: true };
            }
        }
    }
}

但当我运行它时,会一个接一个地返回数字.

let range = new Range(6);
for (i of range) log(i);

输出

0
1
2
3
4
5

但是当我以for (let i of Range(5) log(i);的速度运行它时,它返回undefined为什么!

如果通过将return new Range(start, end, step);更新为return new Range(end, start, step);并将end = start ? start : end;更新为end = start ?? end;来修复问题,则为update

所以当我跑的时候

let range = new Range(5); 
for (let i of range) log( i ); // 0, 1, 2, 3, 4
for (let i of Range(10) ) log( i ); // 0, 1, 2, 3, 4

但一个新的问题出现了

let arr = Array.from(range); 
log(arr) // []

如何修复它?

推荐答案

你在new Range(start, end, step)中混淆了你的论点(谢谢@Unmitiated).应该是new Range(end, start, step).


尽管FWIW生成函数要简单得多.

function* range(start, end, step = 1) {
  if (end === undefined) {
    end = start;
    start = 0;
  }
  for (; start < end; start += step) {
    yield start;
  }
}

Javascript相关问答推荐

微软Edge Select 间隙鼠标退出问题

我应该在redux reducer中调用其他reducer函数吗?

GrapeJS -如何保存和加载自定义页面

被CSS优先级所迷惑

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

配置WebAssembly/Emscripten本地生成问题

如何在ASP.NET JavaScript中使用Google Charts API仅对绘制为负方向的条形图移动堆叠条形图标签位置

提交链接到AJAX数据结果的表单

当我在Reaction中创建一个输入列表时,我的输入行为异常

如何将zoom 变换应用到我的d3力有向图?

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

有效路径同时显示有效路径组件和不存在的路径组件

在表单集中保存更改时删除';禁用';

背景动画让网站摇摇欲坠

本地损坏的Java脚本

如何在移动设备中使用JAVASSCRIPT移除点击时的焦点/悬停状态

重新渲染过多(&Q).REACT限制渲染次数以防止无限循环.使用REACT下拉菜单时

脚本语法错误只是一个字符串,而不是一个对象?

Refine.dev从不同的表取多条记录