在 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 值,因为您通常只需要一致的产生值。