javascript - 如何在 JavaScript 中创建可迭代对象?

标签 javascript iterable

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

我试图理解 JavaScript 中的迭代,因此我创建了一个范围函数,当我调用它时,它会为我返回一系列数字,例如:

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;

所以当我运行时

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)中混淆了您的参数(感谢@Unmitigated)。它应该是new Range(end, start, step)


仅供引用,生成器函数要简单得多。

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

关于javascript - 如何在 JavaScript 中创建可迭代对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75885173/

相关文章:

javascript - 如何检测并拒绝对 MVC Controller 的非 JavaScript 发布

javascript - 如何通过拖动整个底部边框线而不是 react 中的右下角来调整div高度?

php - jQuery ajax 输出作为函数的返回

python - 在 Python 中组合两种不同的可迭代类型

odoo - 类型错误 : 'int' object is not iterable in wizard

javascript - 如何将值从 JSON API 放入 Angular 模板指令

javascript - 在 JSP 中使用 javascript 的所有字段未显示验证错误

java - Neo4j Iterable<String> getPropertyKeys() 无限循环?这是一个错误吗?

java - Kotlin 类似于 Java 中的选择器

java - 是否实现可迭代类型?