--- title: yield* slug: Web/JavaScript/Reference/Operators/yield* tags: - ECMAScript6 - JavaScript translation_of: Web/JavaScript/Reference/Operators/yield* original_slug: Web/JavaScript/Referencia/Operadores/yield* ---
La expresión yield* es usada para delegar a otro {{jsxref("Statements/function*", "generator")}} u objeto iterable.
yield* [[expression]];
expressionLa expresión yield* itera sobre el operador realizando yield de cada valor retornado por este.
El valor de la expresion yield* es el valor retornado por el iterador en si mismo cuando es finalizado (ej., cuando done es true).
En el siguiente código, los valores declarados con yield en g1() son devueltos por las llamadas a next() al igual que en g2().
function* g1() {
yield 2;
yield 3;
yield 4;
}
function* g2() {
yield 1;
yield* g1();
yield 5;
}
var iterator = g2();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
Además de los objetos generator, yield* también se puede usar yield sobre otros tipos de iterables, ej. arrays, strings u objetos arguments.
function* g3() {
yield* [1, 2];
yield* "34";
yield* Array.from(arguments);
}
var iterator = g3(5, 6);
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: "3", done: false }
console.log(iterator.next()); // { value: "4", done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: 6, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
yield*yield* es una expresión, no una declaración, por lo que se evalua como un valor.
function* g4() {
yield* [1, 2, 3];
return "foo";
}
var result;
function* g5() {
result = yield* g4();
}
var iterator = g5();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true },
// g4() returned { value: "foo", done: true } at this point
console.log(result); // "foo"
| Especificación | Estado | Comentarios |
|---|---|---|
| {{SpecName('ES6', '#', 'Yield')}} | {{Spec2('ES6')}} | Definición inical. |
| {{SpecName('ESDraft', '#', 'Yield')}} | {{Spec2('ESDraft')}} |
function* foo() {
yield
*[];
}