Une expression yield* est utilisée afin de déléguer le mécanisme d'itération/génération à un autre générateur ou à un autre objet itérable.

Syntaxe

 yield* [[expression]];
expression
L'expression qui renvoie un objet itérable.

Description

L'expression yield* itère sur l'opérande et génère chaque valeur générée par l'opérande.

La valeur de l'expression yield* est la valeur renvoyée par l'itérateur lorsque celui est terminé (la propriété done vaut true).

Exemples

Délégation de la génération

Dans le code suivant, les valeurs générées par g1() sont renvoyées grâce aux appels à la fonction next(), comme pour celles renvoyées par 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 }

Les autres objets itérables

yield* peut également être utilisé avec d'autres sortes d'itérables (chaînes, tableaux ou 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 }

La valeur de l'expression yield*

yield* est une expression et non une instruction, elle est donc évaluée et fournit une valeur :

function* g4() {
  yield* [1, 2, 3];
  return "toto";
}

var résultat;

function* g5() {
  résultat = 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() renvoie{ value: "toto", done: true } at this point

console.log(résultat);          // "toto"

Spécifications

Spécification État Commentaires
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'Yield' dans cette spécification.
Standard Définition initiale
ECMAScript Latest Draft (ECMA-262)
La définition de 'Yield' dans cette spécification.
Projet  

Compatibilité des navigateurs

FonctionnalitéChromeEdgeFirefoxInternet ExplorerOperaSafari
Support simple Oui Oui271 Non Oui10
FonctionnalitéAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Support simple Oui Oui Oui271 Oui10 Oui

1. Starting with Firefox 33, the parsing of the yield expression has been updated to conform with the ES2015 specification.

2. From version 0.12: this feature is behind the --harmony runtime flag.

Notes relatives à Firefox

  • À partir de Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), l'analyse de l'expression yield a été mise à jour pour être conforme aux spécifications ES2015 (bug 981599) :
    • La restriction concernant les terminateurs de lignes est désormais implémentée. Il n'est pas autorisé d'avoir un terminateur de ligne entre "yield" et "*". Le code suivant lèvera une exception SyntaxError:
      function* toto() {
        yield
        *[];
      }

Voir aussi

Étiquettes et contributeurs liés au document

Contributeurs à cette page : SphinxKnight
Dernière mise à jour par : SphinxKnight,