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

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!
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