yield*

La expresi贸n yield* es usada para delegar a otro generator u objeto iterable.

Sintaxis

 yield* [[expression]];
expression
La expresi贸n que retorna un objeto iterable

Descripci贸n

La 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).

Ejemplos

Delegando a otro generator

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 }

Otros objetos iterables

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 }

El valor de la expresi贸n 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"

Especificaciones

Especificaci贸n Estado Comentarios
ECMAScript 2015 (6th Edition, ECMA-262)
La definici贸n de 'Yield' en esta especificaci贸n.
Standard Definici贸n inical.
ECMAScript (ECMA-262)
La definici贸n de 'Yield' en esta especificaci贸n.
Living Standard  

Compatibilidad con navegadores

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help! (en-US)

Caracter铆stica Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Soporte b谩sico  (Yes) 27.0 (27.0) ? ? ?
Caracter铆stica Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Soporte b谩sico (Yes) 27.0 (27.0) ? ? ?

Notas espec铆ficas de Firefox

  • Iniciando con Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), el an谩lisis del yield expression ha sido actualizado para cumplir con la 煤ltima especificaci贸n ES6 (error 981599):
    • Ahora est谩 implementada la restricci贸n de salto de l铆nea. No est谩 permitido el salto de l铆nea entre "yield" y "*". C贸digo como el siguiente lanzar谩 una SyntaxError:
      function* foo() {
        yield
        *[];
      }

Ver tambi茅n