2014年11月3日

Nightly で "@@iterator" が Symbol.iterator に変わりました (更新あり)

Bug 918828 で、これまで文字列の "@@iterator" を使用していた @@iterator プロパティが Symbol.iterator に変更されました。
この変更は Bug 1066322 が FIXED になるまで (つまり Symbol が有効になるまで) Nightly 限定となります。
[11/13 更新] FIXED になりました。Firefox 36 から Symbol 使えるようです。

これまでは、以下のようなコードを書くと動いていましたが、
var a = {
  "@@iterator": function*() {
    yield 1;
    yield 2;
  }
};
[...a];

この変更の後は、以下のように書き換える事で同じ動作をします。

var a = {
  [Symbol.iterator]: function*() {
    yield 1;
    yield 2;
  }
};
[...a];

Computed property を使用しない場合は、以下のようになります。

var a = {
};
a[Symbol.iterator] = function*() {
  yield 1;
  yield 2;
};
[...a];


しばらくは、アドオンや Firefox 本体のコードでは両方をサポートする必要があります。 Bug 918828 のパッチの中では以下のようなコードが多用されていました。

const JS_HAS_SYMBOLS = typeof Symbol === "function";
const ITERATOR_SYMBOL = JS_HAS_SYMBOLS ? Symbol.iterator : "@@iterator";

まとめると以下のようになります。

const JS_HAS_SYMBOLS = typeof Symbol === "function";
const ITERATOR_SYMBOL = JS_HAS_SYMBOLS ? Symbol.iterator : "@@iterator";
var a = {
  [ITERATOR_SYMBOL]: function*() {
    yield 1;
    yield 2;
  }
};
[...a];

0 件のコメント:

コメントを投稿