この記事は編集レビューを必要としています。ぜひご協力ください。
この翻訳は不完全です。英語から この記事を翻訳 してください。
This is an experimental technology, part of the Harmony (ECMAScript 7) proposal.
Because this technology's specification has not stabilized, check the compatibility table for usage in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future version of browsers as the spec changes.
generator comprehension 構文はすぐに既存の反復可能なオブジェクトに基づいて新たなジェネレータ関数を組み立てることができJavaScriptの式です。内包表記は、多くのプログラミング言語に存在し、今後のECMAScriptの7標準では、JavaScriptの配列の内包表記を定義します。
ECMAScript第4版への提案に基づいたSpiderMonkeyでの古いジェネレータ式構文との違いについては、下記をご覧ください。
構文
(for (x of iterable) x) (for (x of iterable) if (condition) x) (for (x of iterable) for (y of iterable) x + y)
説明
ジェネレータ内包表記の中では、この2種類のコンポーネントが許可されています。:
for-of
イテレーションは常に最初のコンポーネントです。複数のfor-of
イテレーションまたはif文が許可されています。
例
簡単なジェネレータ内包表記
(for (i of [ 1, 2, 3 ]) i*i ); // generator function which yields 1, 4, and 9 [...(for (i of [ 1, 2, 3 ]) i*i )]; // [1, 4, 9] var abc = [ "A", "B", "C" ]; (for (letters of abc) letters.toLowerCase()); // generator function which yields "a", "b", and "c"
if文と用いたジェネレータ内包表記
var years = [ 1954, 1974, 1990, 2006, 2010, 2014 ]; (for (year of years) if (year > 2000) year); // generator function which yields 2006, 2010, and 2014 (for (year of years) if (year > 2000) if(year < 2010) year); // generator function which yields 2006, the same as below: (for (year of years) if (year > 2000 && year < 2010) year); // generator function which yields 2006
ジェネレータ関数と比較したジェネレータ内包表記
ジェネレータ内包表記構文を理解する簡単な方法はジェネレータ関数と比較することです。
例 1: 簡単なジェネレータ
var numbers = [ 1, 2, 3 ]; // Generator function (function*() { for (let i of numbers) { yield i * i; } })() // Generator comprehension (for (i of numbers) i*i ); // Result: both return a generator which yields [ 1, 4, 9 ]
例 2: ジェネレータ内でif
を使用する
var numbers = [ 1, 2, 3 ]; // Generator function (function*() { for (let i of numbers) { if (i < 3) { yield i * 1; } } })() // Generator comprehension (for (i of numbers) if (i < 3) i); // Result: both return a generator which yields [ 1, 2 ]
仕様
仕様 | ステータス | コメント |
---|---|---|
ECMAScript 7に対する提案 | まだドラフトは利用できません | ECMAScript第6版で初期化されましたが、リビジョン 27 (2014年8月)で取り除かれました。仕様セマンティクスについて、ES 6の古いリビジョンをご覧ください。更新されたバージョンが新しいES 7 ドラフトになって戻ってきます。 |
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本サポート | 未サポート | 30 (30) | 未サポート | 未サポート | 未サポート |
機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
基本サポート | 未サポート | 未サポート | 30.0 (30) | 未サポート | 未サポート | 未サポート |
SpiderMonkey固有の実装メモ
let
は現在JS バージョン 1.7とXULスクリプトタグのみ利用可能ですので、識別子としてのlet
はサポートされていません。- 内包表記での構造化代入はまだサポートされていません(バグ 980828)。
古いJS1.7/JS1.8内包表記との違い
- ES7内包表記は全体のかわりに"for"ノードごとに1スコープを生成します。
- 旧:
[...(()=>x for (x of [0, 1, 2]))][1]() // 2
- 新:
[...(for (x of [0, 1, 2]) ()=>x)][1]() // 1, each iteration creates a fresh binding for x.
- 旧:
- ES7内包表記は代入式のかわりに"for"で始まります。
- 旧:
(i * 2 for (i of numbers))
- 臣:
(for (i of numbers)
i * 2
)
- 旧:
- ES7内包表記は複数の
if
とfor
コンポーネントを持ちます。 - ES7内包表記は
でのみ動作し、for...of
イテレーションでは動作しません。for...in