-5

在尝试了解如何使用 KoaJS 时,我开始意识到yield* undefinedbabel 和 traceur 之间的行为不同。Babel 似乎忽略了该语句,而 traceur 抛出了异常。可以在此处查看示例:Babel - Traceur或以下:

function* gen() {
  console.log('will \'yield 1\'');
  yield 1;
  console.log('will \'yield undefined\'');
  yield undefined;
  console.log('will \'yield* undefined\'');
  yield* undefined;
  console.log('will \'yield 2\'');
  yield 2;
}

let y = gen();
while(true) {
  try {
    let r = y.next();
    console.log(JSON.stringify(r));
    if(r.done)
      break;
  }
  catch(e) {
    console.log();
    console.log(e);
    console.log();
  };
}

我尝试在规范中查找它并且只得到更多的混乱,因为规范yield看起来不像yield undefined应该返回{done: false}(无值属性),但这就是在两个转译器中发生的事情(也在上面的示例中)。至于yield*,我没有找到为什么 traceur 应该抛出的答案。我还没有用 v8 (node/iojs) 尝试这个。

所以问题是,在这两种情况下正确/预期的行为是什么?

4

1 回答 1

3

正如您在参考的规范中看到的那样,在 的情况下yield* expressionexpression 需要有一个@@iterator属性,它需要是一个方法;否则抛出异常。因此,应该因为没有属性yield* undefined而抛出异常。undefined@@iterator

在 的情况下yield undefinedundefined应该让步。这也是发生的事情。但是,在您的示例中,您 evaluate JSON.stringify({value: undefined, done: false}),它返回'{"done": false}'是因为undefinedJSON 中没有这样的东西。

于 2015-05-29T12:01:42.603 回答