在JavaScript中,yield*是否等同于使用普通yield的while循环?

5

If I have a line like:

yield* foo()

我能否用类似以下的内容替换它:

while(true) {
   var x = foo.next();
   if(x.done)
       break;
    yield x;
}

显然这个表达更冗长,但我想了解yield*只是语法糖还是有一些我不清楚的语义方面。


3
没错,就是这样。更简单的说法是:for (var x of foo()) { yield x; }。规范参考链接:http://www.ecma-international.org/ecma-262/7.0/#sec-generator-function-definitions-runtime-semantics-evaluation。*编辑:* 你需要先调用 foo() 来获取迭代器。 - Felix Kling
"yield* 表达式用于委托至另一个生成器或可迭代对象。" - guest271314
谢谢,@FelixKling。我感觉自己正在患上分号癌。 - Joshua Engel
谢谢@FelixKling提供的规范链接。该规范具有处理可迭代对象抛出异常的一些额外功能。而且,yield实际上会产生一个IterResultObject,而yield*则不会...还有一个叫做“return”的类型的奇怪之处。 - Joshua Engel
1个回答

1
与其使用yield x,您需要使用yield x.value。您还需要调用foo以获取迭代器。.next是由foo生成器返回的迭代器的一种方法。

function *foo() {
  yield 1;
  yield 2;
  yield 3;
}

function *f() {
  yield *foo();
}

console.log(Array.from(f()));

function *g() {
  var iterator = foo();
  while (true) {
    var x = iterator.next();
    if (x.done) break;
    yield x.value;
  }
}

console.log(Array.from(g()));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接