什么是" yield * undefined"的正确(spec-wise)行为是什么? &安培; "产量未定义"在ES6?

时间:2015-05-29 11:37:02

标签: yield ecmascript-6 babeljs traceur

在尝试理解如何使用KoaJS时,我开始意识到 if (tab[j] && listeService[i] == tab[j][0]) { resultat.push(tab[j][1]); j++; } else { resultat.push(0); j++; } 在babel和amp;之间表现不同。 traceur。 Babel似乎忽略了这个陈述,而traceur抛出异常。 可在此处查看示例:Babel - Traceur或以下:



yield* undefined




我尝试在spec中查找它并且只会引起更多混淆,因为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应该返回{{1} (没有值属性),但这是两个转换器中发生的事情(也在上面的示例中)。至于yield undefined,我没有找到为什么traceur应该抛出的答案。我还没有尝试使用v8(node / iojs)。

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

1 个答案:

答案 0 :(得分:3)

正如您在yield* expressionexpression needs to have a @@iterator property的情况下所引用的规范中所见,这需要是一种方法;否则抛出异常。因此,yield* undefined应该抛出异常,因为undefined没有@@iterator属性。

如果是yield undefined,则应该产生undefined。这也是发生的事情。但是,在您的示例中,您评估的JSON.stringify({value: undefined, done: false})会返回'{"done": false}',因为JSON中没有undefined这样的内容。