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の構文も両方サポートしている。拡張機能内などでは、既存構文が使われているのでしばらくは両方サポートの状態が続くと思う。