Generator comprehensions

この翻訳は不完全です。英語から この記事を翻訳 してください。

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内包表記は複数のifforコンポーネントを持ちます。
  • ES7内包表記はfor...ofでのみ動作し、for...inイテレーションでは動作しません。

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: shide55
 最終更新者: shide55,