在 JavaScript 中,使用 for-of 循环迭代生成器会忽略 return 语句,为什么?
In JavaScript, Iterating over generator using for-of loop ignore return statement why?
仔细看代码
function* NinjaGenerator() {
yield "yoshi";
return "Hattori";
}
for (let ninja of NinjaGenerator()) {
console.log(ninja);
}
// console log : yoshi
为什么没有记录“Hattori”? 当我们使用 iterator.next() 遍历迭代器时,它会显示该值。
function* NinjaGenerator() {
yield "yoshi";
return "Hattori";
}
let ninjaIterator = NinjaGenerator();
let firstValue = ninjaIterator.next().value;
let secondValue = ninjaIterator.next().value;
console.log(firstValue, secondValue);
// console log: yoshi Hattori
有人请帮助我了解 for-of 循环在生成器创建的迭代器中是如何工作的?
next()
的值有一个 done
属性 来区分 return 值和产生的值。屈服值 done = false
,而 returned 值 done = true
.
for-of
处理值直到 done = true
,并忽略该值。否则,没有显式 return
语句的生成器总是会在 for
循环中产生额外的 undefined
。当您编写生成器时,您必须对其进行编码以在最后一次迭代中使用 return
而不是 yield
,这会使它不必要地复杂化。很少需要 return 值,因为您通常只需要一致的产生值。
仔细看代码
function* NinjaGenerator() {
yield "yoshi";
return "Hattori";
}
for (let ninja of NinjaGenerator()) {
console.log(ninja);
}
// console log : yoshi
为什么没有记录“Hattori”? 当我们使用 iterator.next() 遍历迭代器时,它会显示该值。
function* NinjaGenerator() {
yield "yoshi";
return "Hattori";
}
let ninjaIterator = NinjaGenerator();
let firstValue = ninjaIterator.next().value;
let secondValue = ninjaIterator.next().value;
console.log(firstValue, secondValue);
// console log: yoshi Hattori
有人请帮助我了解 for-of 循环在生成器创建的迭代器中是如何工作的?
next()
的值有一个 done
属性 来区分 return 值和产生的值。屈服值 done = false
,而 returned 值 done = true
.
for-of
处理值直到 done = true
,并忽略该值。否则,没有显式 return
语句的生成器总是会在 for
循环中产生额外的 undefined
。当您编写生成器时,您必须对其进行编码以在最后一次迭代中使用 return
而不是 yield
,这会使它不必要地复杂化。很少需要 return 值,因为您通常只需要一致的产生值。