Firfox 30(Nightly)で ES6的な ArrayComprehension,GeneratorComprehension が実装された

書くのが1週間ほど遅れた。

var arry = [for (value of iteratableObject) value]; // ArrayComprehension
/* ==
(function() {
  var list = [];
  for (let value of iteratableObject) {
    list.push(value);
  }
  return list;
}());
*/

var gene = (for (value of iteratableObject) value); // GeneratorComprehension
/* ==
(function *() {
  for (let value of iteratableObject) {
    yield value;
  }
}());
*/

基本的な構文は上記のような感じ。コメント部に書いたのに近いコードを短縮して書けると思えば良いと思う。

for-of 部分は続けて書けるし、if () によるフィルタリングも可能

var list = [
  ["a", "b"],
  ["c", 10],
  "d",
];

[for (child of list) for (v of child) if (typeof v === "string") v].join("/");
// "a/b/c/d"
[for (child of list) if (Array.isArray(child)) for (v of child) if (typeof v === "string") v].join("/");
// "a/b/c"

Mozilla既存のArrayComprehension, GeneratorComprehension

ES6に入る前からMozilla JavaScript 1.8[developer.mozilla.org]からこれらがあり、ES6も当初はこの構文だった。

[v for (value1 of iteratableObject) for (v of value1)];

最初に最終的に取られる値を指定した後に for-of を書くような感じだった。
ただ、これだと評価の順が混乱しやすい。

     [v for (value1 of iteratableObject) for (v of value1)];
// 1.     >--実行---------------------->
// 2.                                     >--実行-------->
// 3. 値

という順番が正しいのだが、以下の方が自然にも思える。

     [v for (v of value1) for (value1 of iteratableObject)];
// 1.                     >--実行------------------------>
// 2.     >--実行------->
// 3. 値

で、結局、現在の下記の様な順番の方が自然だよね、という話になったと記憶している(あやふやだが)

     [for (value1 of iteratableObject) for (v of value1) v];
// 1. >--実行------------------------>
// 2.                                  >--実行--------->
// 3.                                                    値

現状のFirefoxでは、既存の構文もES6の構文も両方サポートしている。拡張機能内などでは、既存構文が使われているのでしばらくは両方サポートの状態が続くと思う。