概要

Generator オブジェクトは ジェネレーター関数 によって返され、iterable プロトコルiterator プロトコル の両方に従います。

構文

function* gen() { 
  yield 1;
  yield 2;
  yield 3;
}

var g = gen(); // "Generator { }"

メソッド

Generator.prototype.next()
yield 式によって得られる値を返します。
Generator.prototype.return()
与えられた値を返し、ジェネレーターを終了します。
Generator.prototype.throw()
エラーをジェネレーターにスローします。(ジェネレータ内でキャッチされない限り、そのジェネレータも終了します)

無限イテレーター

function* idMaker(){
    var index = 0;
    while(true)
        yield index++;
}

var gen = idMaker(); // "Generator { }"

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...

レガシージェネレーターオブジェクト

Firefox (SpiderMonkey) は JavaScript 1.7 で、ジェネレーター初期バージョンも実装しました。これは関数の宣言でアスタリスク (*) を必要としません (関数の本体で yield キーワードを使用するだけです)。しかし、レガシージェネレータのサポートはFirefox58から削除されています。(2018年1月23日リリース) (バグ 1083482)。

レガシージェネレーターメソッド

Generator.prototype.next()
yield 式によって得られる値を返します。 これは ES6 ジェネレーターオブジェクトの next() と一致します。
Generator.prototype.close()
ジェネレーターを閉じます。そのため、next() をコールすると、StopIteration エラーがスローされます。これは ES6 ジェネレーターオブジェクトの return() メソッドに一致します。
Generator.prototype.send()
ジェネレーターに値を送るために使われます。yield 式から値が返され、次の yield 式によって値を返します。send(x) は ES6 ジェネレーターオブジェクトの next(x) に一致します。
Generator.prototype.throw()
ジェネレーターにエラーをスローします。これはES6ジェネレーターオブジェクトの throw() に一致します。

レガシージェネレーターの例

function fibonacci() {
  var a = yield 1;
  yield a * 2;
}

var it = fibonacci();
console.log(it);          // "Generator {  }"
console.log(it.next());   // 1
console.log(it.send(10)); // 20
console.log(it.close());  // undefined
console.log(it.next());   // throws StopIteration (as the generator is now closed)

仕様

仕様 状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Generator objects の定義
標準 初回定義。
ECMAScript Latest Draft (ECMA-262)
Generator objects の定義
ドラフト  

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 39Edge 完全対応 13Firefox 完全対応 26IE 未対応 なしOpera 完全対応 ありSafari 完全対応 10WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 13Firefox Android 完全対応 26Opera Android 完全対応 ありSafari iOS 完全対応 10Samsung Internet Android 完全対応 ありnodejs 完全対応 4.0.0
完全対応 4.0.0
完全対応 0.12
無効
無効 From version 0.12: this feature is behind the --harmony runtime flag.
nextChrome 完全対応 39Edge 完全対応 13Firefox 完全対応 26IE 未対応 なしOpera 完全対応 ありSafari 完全対応 10WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 13Firefox Android 完全対応 26Opera Android 完全対応 ありSafari iOS 完全対応 10Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
returnChrome 完全対応 50Edge 完全対応 13Firefox 完全対応 38IE 未対応 なしOpera 完全対応 37Safari 完全対応 10WebView Android ? Chrome Android 完全対応 50Edge Mobile 完全対応 13Firefox Android 完全対応 38Opera Android 完全対応 ありSafari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0
throwChrome 完全対応 39Edge 完全対応 13Firefox 完全対応 26IE 未対応 なしOpera 完全対応 ありSafari 完全対応 10WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 13Firefox Android 完全対応 26Opera Android 完全対応 ありSafari iOS 完全対応 10Samsung Internet Android 完全対応 ありnodejs 完全対応 4.0.0
完全対応 4.0.0
完全対応 0.12
無効
無効 From version 0.12: this feature is behind the --harmony runtime flag.

凡例

完全対応  
完全対応
未対応  
未対応
実装状況不明  
実装状況不明
ユーザーが明示的にこの機能を有効にしなければなりません。
ユーザーが明示的にこの機能を有効にしなければなりません。

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

このページの貢献者: inkusu, Uemmra3, hotstaff, vyv03354, dskmori, Javascipt, shide55
最終更新者: inkusu,