概要: このチュートリアルでは、JavaScript のyield
キーワードと、ジェネレータ関数での使用方法について学習します。
JavaScript yieldキーワードの紹介
yield
キーワードを使用すると、ジェネレータ関数(function*
)を一時停止および再開できます。
yield
キーワードの構文を次に示します。
[variable_name] = yield [expression];
Code language: JavaScript (javascript)
この構文では
expression
は、イテレーションプロトコルを介してジェネレータ関数から返す値を指定します。expression
を省略すると、yield
はundefined
を返します。variable_name
は、イテレータオブジェクトのnext()
メソッドに渡されるオプションの値を格納します。
JavaScript yield の例
yield
キーワードの使用例をいくつか見てみましょう。
A) 値の返却
次の簡単な例は、yield
キーワードを使用してジェネレータ関数から値を返す方法を示しています。
function* foo() {
yield 1;
yield 2;
yield 3;
}
let f = foo();
console.log(f.next());
Code language: JavaScript (javascript)
出力
{ value: 1, done: false }
Code language: CSS (css)
ご覧のように、yield
の後に続く値は、next()
が呼び出されたときに戻りオブジェクトのvalue
プロパティに追加されます。
yield 1;
Code language: JavaScript (javascript)
B) undefined の返却
この例は、yield
キーワードを使用してundefined
を返す方法を示しています。
function* bar() {
yield;
}
let b = bar();
console.log(b.next());
Code language: JavaScript (javascript)
出力
{ value: undefined, done: false }
Code language: CSS (css)
C) next()メソッドへの値の渡
次の例では、yield
キーワードは、next()
メソッドに渡された引数を評価する式です。
function* generate() {
let result = yield;
console.log(`result is ${result}`);
}
let g = generate();
console.log(g.next());
console.log(g.next(1000));
Code language: JavaScript (javascript)
最初の呼び出しg.next()
は、次のオブジェクトを返します。
{ value: undefined, done: false }
Code language: CSS (css)
2回目の呼び出しg.next()
は、次のタスクを実行します。
yield
を1000に評価します。result
にyield
の値(1000)を代入します。- メッセージを出力し、オブジェクトを返します。
出力
result is 1000
{ value: undefined, done: true }
Code language: CSS (css)
D) 配列での yield の使用
次の例では、yield
キーワードを配列の要素として使用しています。
function* baz() {
let arr = [yield, yield];
console.log(arr);
}
var z = baz();
console.log(z.next());
console.log(z.next(1));
console.log(z.next(2));
Code language: JavaScript (javascript)
最初の呼び出しz.next()
は、arr
配列の最初の要素を1に設定し、次のオブジェクトを返します。
{ value: undefined, done: false }
Code language: CSS (css)
2回目の呼び出しz.next()
は、arr
配列の2番目の要素を2に設定し、次のオブジェクトを返します。
{ value: undefined, done: false }
Code language: CSS (css)
3回目の呼び出しz.next()
は、arr
配列の内容を表示し、次のオブジェクトを返します。
[ 1, 2 ]
{ value: undefined, done: true }
Code language: CSS (css)
E) yield を使用して配列を返す
次のジェネレータ関数は、yield
キーワードを使用して配列を返します。
function* yieldArray() {
yield 1;
yield [ 20, 30, 40 ];
}
let y = yieldArray();
console.log(y.next());
console.log(y.next());
console.log(y.next());
Code language: JavaScript (javascript)
最初の呼び出しy.next()
は、次のオブジェクトを返します。
{ value: 1, done: false }
Code language: CSS (css)
2回目の呼び出しy.next()
は、次のオブジェクトを返します。
{ value: [ 20, 30, 40 ], done: false }
Code language: CSS (css)
この場合、yield
は[ 20, 30, 40 ]
配列を戻りオブジェクトのvalue
プロパティの値として設定します。
3回目の呼び出しy.next()
は、次のオブジェクトを返します。
{ value: undefined, done: true }
Code language: CSS (css)
F) yield を使用して配列の個々の要素を返す
次のジェネレータ関数を参照してください。
function* yieldArrayElements() {
yield 1;
yield* [ 20, 30, 40 ];
}
let a = yieldArrayElements();
console.log(a.next()); // { value: 1, done: false }
console.log(a.next()); // { value: 20, done: false }
console.log(a.next()); // { value: 30, done: false }
console.log(a.next()); // { value: 40, done: false }
Code language: JavaScript (javascript)
この例では、yield*
は新しい構文です。yield*
式は、別のイテラブルオブジェクトまたはジェネレータに委任するために使用されます。
その結果、次の式は[20, 30, 40]
配列の個々の要素を返します。
yield* [20, 30, 40];
Code language: JavaScript (javascript)
このチュートリアルでは、JavaScriptのyield
キーワードと、関数ジェネレータでの使用方法について学習しました。