Firefox 27(Nightly) の yield が { done, value } を返すようになった

ちょっと前に、Generator のプロトタイプ で書いたが、function * () { yield ...; } な構文が導入された。

また、最近ユーザ作成の Generator.next() が { done: Boolean, value: Value } なオブジェクトを返すように変更された。*1

function * gene () {
  for (var i = 0; i < 3; ++i) {
    yield i;
  }
}

var geneObj = gene(),
    done, value;
while ({ done, value } = geneObj.next(), !done) {
  console.log(value);
}

と、まぁこんな感じに書ける*2

ただし

  1. この変更にfor-of等の構文が追いついていない
  2. ビルトインでgeneratorを返すものも、この仕様になっていない
    • → ビルトインのgeneratorとfor-ofは正常動作する

ということで、Bugzilla へ報告済み

追記(2013-09-28)

Mozilla JavaScript 1.7 あたりから使える*が付かない Generator の挙動は変更されていない様子。

function gene () {
  for (var i = 0; i < 3; ++i) {
    yield i;
  }
}

var geneObj = gene(); 
try {
  while (true) {
    console.log(geneObje.next());
  }
} catch (e) {
  console.error(e);
}
// 0
// 1
// 2
// [object StopIteration]

という結果になり、従来通りの挙動。

*付きGenerator は最近実装されたばかりだし、Firefox内部やアドオンでも使われていないだろうから、何かが動かなくなったとかそういうのはないと思われる。

追記(2013-10-05)

により、修正された。

また、同時に、今まで iterator というメソッドがあると for-of 等で iterable だと判断されていたものが、この修正により "@@iterator" というメソッド名に代わった。

ES6 では @@*** なプロパティはSymbol型*3であるが、この修正ではまだ文字列であり、ECMAScript 6th valid な変更ではない点に注意。このあたり、Symbold オブジェクトが実装され次第、順次変わって行くと思われ、変更が目まぐるしい箇所になりそう。

*1:該当バグやコミットが見つけられない…orz

*2:V8エンジンでは分割代入が実装されてないのでwhileの条件く部分は動かないよ

*3:typeof @@iterator === "symbol"