【问题标题】:What does the * (star/asterisk) syntax after a yield mean in a recursive generator function? [duplicate]在递归生成器函数中,yield 后的 *(星号/星号)语法是什么意思? [复制]
【发布时间】:2016-09-11 09:23:12
【问题描述】:

假设我创建了一个 ES6 生成器

function *createFibonacciIterator(a = 0, b = 1) {
  yield b;
  yield *createFib(b, b + a); // <== QUESTION IS ABOUT THIS LINE
}

然后我使用该生成器获取前 20 个结果

let fibber = createFibonacciIterator();
for (let ii = 0; ii < 20; ii++) {
    console.log(fibber.next());
}

如果我将* 留在yield *createFib(b, b + a); 行之外,事情就会中断,这是有道理的,因为我不想产生一个迭代器而是一个实际值。

*在生成器中的技术含义是什么?

【问题讨论】:

  • yield * 委托给另一个生成器。
  • 可能是 yield * flatten the values and concat them into generator function* 懒惰地。

标签: javascript iterator ecmascript-6 generator yield


【解决方案1】:

对于大多数情况

yield *smth;

做同样的事情

for (let x of smth) {
  yield x;
}

【讨论】:

  • 这是一个可以的简化,但它无法解决 yield *generator() 的计算结果,结果是生成器对象的迭代结束值 return'。它也不能正确地表示当生成器的消费者扔进生成器时会发生什么,等等。
  • @torazaburo,你能举个例子吗?
【解决方案2】:

*function 声明中使用时,这意味着它是一个生成器函数。

但是当它用作yield *myGeneratorFunction()时,Ecmascript 262 specification, Section 14.4.14的定义表示引擎试图解析生成器函数调用生成器函数返回的迭代器的next()方法。

yield* 一起使用时(例如yield createFibonacci()),它返回yield 之后的表达式的值。在示例中是 createFibonacci 的返回值。

【讨论】:

  • 是的,这样更好。谢谢
  • 这有点混乱。你说迭代器的下一个值是函数的返回值,但yield 不是函数。它是一个关键字,它产生一个值。你说“引擎试图解决......”,但实际上发生的事情是 myGeneratorFunction 被按预期调用,返回一个可迭代对象,并且 yield * 像其他任何可迭代对象一样对其进行操作(例如 [1, 2] , 例如)。生成器函数没有next() 方法;它是具有next() 函数的生成器函数返回的可迭代
  • 我提到的函数是createFibonacci,而不是yield keyworld。是的,生成器返回的迭代器将被解析。我会编辑清楚,但你说的是正确的。谢谢。
  • yield *myGeneratorFunction() 所做的另一种说法:它基本上在您的生成器中运行一个生成器(它“委托”给另一个生成器)。例如,如果您想将两个迭代器合二为一,您可以这样做:yield *genFunction1(); yield *genFunction2()。文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…*
猜你喜欢
  • 2016-09-16
  • 2018-11-21
  • 2010-09-28
  • 2016-12-15
  • 2011-05-09
  • 2015-05-23
  • 2011-02-24
相关资源
最近更新 更多