--- title: yield slug: Web/JavaScript/Reference/Operators/yield tags: - ECMAScript 2015 - Generators - Iterator - JavaScript - Language feature - Operator - ジェネレーター - 反復処理 - 演算子 - 言語機能 translation_of: Web/JavaScript/Reference/Operators/yield ---
yield キーワードは、ジェネレーター関数 ({{jsxref("Statements/function*", "function*")}} または古いジェネレーター関数) のを一時停止したり再開したりするために使用します。
[rv] = yield [expression]
expression {{optional_inline}}undefined が返されます。rv {{optional_inline}}ジェネレーターの実行を再開する next() メソッドに渡したオプションの値を受け取ります。
yield キーワードは、ジェネレーター関数の実行を一時停止し、ジェネレーターの呼び出し元に yield キーワードに続く値を戻します。これは、 return キーワードのジェネレーター版と考えることができます。
yield はそれを含むジェネレーター関数の中で直接しか呼び出すことしかできません。呼び出し先の関数やコールバックから呼び出すことはできません。
yield キーワードはジェネレーターの next() メソッドを呼び出させ、 value と done の2つのプロパティを持つ IteratorResult オブジェクトを返します。 value プロパティは yield 式の評価結果であり、 done は false、すなわちジェネレーター関数が完全には完了していないことを示します。
yield 式によって実行が停止されると、ジェネレーターの next() メソッドが呼び出されるまで、ジェネレーターのコード実行は一時停止します。ジェネレーターの next() メソッドが呼ばれるたびに、ジェネレーターの実行が再開され、次のうちのいずれかに達するまで実行されます。
yield。再度 next() が呼ばれると yield の直後から実行が再開されます。IteratorResult オブジェクトの value に {{jsxref("undefined")}} が、 done に true が代入されて呼び出し元に返されます。IteratorResult オブジェクトの value に return ステートメントで指定した値が、 done に true が代入されて呼び出し元に返されます。ジェネレーターの next() メソッドにオプションの値が渡された場合、その値はジェネレーターの現在の yield 操作の返値となります。
ジェネレーターのコードパス、 yield 演算子、新しい開始値を {{jsxref("Generator.prototype.next()")}} に渡すことで指定することができる機能により、ジェネレーターは大きな力と制御を提供します。
次のコードはジェネレーター関数の定義例です。
function* countAppleSales () {
let saleList = [3, 7, 5]
for (let i = 0; i < saleList.length; i++) {
yield saleList[i]
}
}
ジェネレーター関数が定義されると、ご覧のようにイテレーターを構築するために使用されます。
let appleStore = countAppleSales() // Generator { }
console.log(appleStore.next()) // { value: 3, done: false }
console.log(appleStore.next()) // { value: 7, done: false }
console.log(appleStore.next()) // { value: 5, done: false }
console.log(appleStore.next()) // { value: undefined, done: true }
| 仕様書 |
|---|
| {{SpecName('ESDraft', '#prod-YieldExpression', 'Yield')}} |
{{Compat("javascript.operators.yield")}}