We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.

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 Latest Draft (ECMA-262)
La definición de 'Yield' en esta especificación.
Draft  

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

Etiquetas y colaboradores del documento

Etiquetas: 
Colaboradores en esta página: germanf
Última actualización por: germanf,