ES6のgeneratorについて
generatorとは
めっちゃ簡単にいうと、何回も入ったり出たりする関数。らしい。
そのほか用語
- イテレーター
順番にイテレータリザルトを取り出すことのできるオブジェクトのこと。
- デリゲーション
委譲。ジェネレーター同士を連携すること。
参考文献 : JavaScript の イテレータ を極める!
書き方
// function後に*をつけることで、generatorにすることができる
function* cheeses() {
// yield - generator関数を一時停止させたり、再開したりするのに使われる
yield 'モッツアレラチーズ';
yield 'カマンベールチーズ';
yield 'チェダーチーズ';
}
let cheese = cheeses();
// next()を使って、次のyieldまで処理を実行することができる
cheese.next();
// 実行結果 : {"value":"モッツアレラチーズ","done":false}
cheese.next();
// 実行結果 : {"value":"カマンベールチーズ","done":false}
cheese.next();
// 実行結果 : {"value":"チェダーチーズ","done":false}
cheese.next();
// 実行結果 : {"done":true}
// 関数内すべての処理がおわったよ〜
使い方
ピザの具材すべてをingredientsという配列に入れる処理を書く。
// ピザのトッピングが定義されているオブジェクト
const toppings = {
vegetable: ['トマト', '玉ねぎ', 'じゃがいも'],
meat: ['ソーセージ'],
/* []: ・・・ es6の動的プロパティ
* Symbol.iterator という特別なkeyをもっている
* [Symbol.iterator]には、ジェネレーターを定義できる
*/
// トッピングを取り出すためのgenerator
[Symbol.iterator]: function* () {
yield this.vegetable
yield this.meat
}
}
// ピザの様々な要素が定義されているオブジェクト
const cheesePizza = {
size: 'large',
price: '2,400',
// ピザにおけるチーズの立ち位置はトッピングとは別だよね。。。
cheese: ['モッツアレラチーズ', 'カマンベールチーズ'],
// ピザのトッピング
toppings,
// すべての具材(ingredients)を取り出すためのgenerator
[Symbol.iterator]: function* () {
yield this.cheese
// 別のgeneratorに委託する
// toppingsオブジェクトに対して、Symbol.iterator(generator)があるか探しに行く
yield* this.toppings
}
}
let ingredients = [];
// for〜of で、generatorのyield分 実行
// cheesePizzaオブジェクトに対して、Symbol.iterator(generator)があるか探しに行く
for(let ingredient of cheesePizza){
ingredients = [...ingredients, ...ingredient]
}
結論
使い所はわからなかった。