Esta página ha sido traducida del inglés por la comunidad.Aprende más y únete a la comunidad de MDN Web Docs.
yield*
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since septiembre de 2016.
La expresiónyield* es usada para delegar a otrogenerator u objeto iterable.
In this article
Sintaxis
yield* [[expression]];
expressionLa expresión que retorna un objeto iterable
Descripción
La expresiónyield* itera sobre el operador realizando yield de cada valor retornado por este.
El valor de la expresionyield* es el valor retornado por el iterador en si mismo cuando es finalizado (ej., cuandodone es true).
Ejemplos
>Delegando a otro generator
En el siguiente código, los valores declarados con yield eng1() son devueltos por las llamadas anext() al igual que eng2().
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 }Otros objetos iterables
Además de los objetos generator,yield* también se puede usaryield 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 }El valor de la expresiónyield*
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 pointconsole.log(result); // "foo"Especificaciones
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-generator-function-definitions-runtime-semantics-evaluation> |