概要
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 (ECMA-262) Generator objects の定義 |
現行の標準 |
ブラウザー実装状況
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Generator | Chrome 完全対応 39 | Edge 完全対応 13 | Firefox 完全対応 26 | IE 未対応 なし | Opera 完全対応 26 | Safari 完全対応 10 | WebView Android 完全対応 39 | Chrome Android 完全対応 39 | Firefox Android 完全対応 26 | Opera Android 完全対応 26 | Safari iOS 完全対応 10 | Samsung Internet Android 完全対応 4.0 | nodejs
完全対応
4.0.0
|
next | Chrome 完全対応 39 | Edge 完全対応 13 | Firefox 完全対応 26 | IE 未対応 なし | Opera 完全対応 26 | Safari 完全対応 10 | WebView Android 完全対応 39 | Chrome Android 完全対応 39 | Firefox Android 完全対応 26 | Opera Android 完全対応 26 | Safari iOS 完全対応 10 | Samsung Internet Android 完全対応 4.0 | nodejs 完全対応 あり |
return | Chrome 完全対応 50 | Edge 完全対応 13 | Firefox 完全対応 38 | IE 未対応 なし | Opera 完全対応 37 | Safari 完全対応 10 | WebView Android 完全対応 50 | Chrome Android 完全対応 50 | Firefox Android 完全対応 38 | Opera Android 完全対応 37 | Safari iOS 完全対応 10 | Samsung Internet Android 完全対応 5.0 | nodejs 完全対応 6.0.0 |
throw | Chrome 完全対応 39 | Edge 完全対応 13 | Firefox 完全対応 26 | IE 未対応 なし | Opera 完全対応 26 | Safari 完全対応 10 | WebView Android 完全対応 39 | Chrome Android 完全対応 39 | Firefox Android 完全対応 26 | Opera Android 完全対応 26 | Safari iOS 完全対応 10 | Samsung Internet Android 完全対応 4.0 | nodejs
完全対応
4.0.0
|
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
- ユーザーが明示的にこの機能を有効にしなければなりません。
- ユーザーが明示的にこの機能を有効にしなければなりません。
日本語 の翻訳:
下書きが自動保存されました: