我试图通过创建范围函数来理解 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/