--- title: yield* slug: Web/JavaScript/Reference/Opérateurs/yield* tags: - ECMAScript 2015 - Generators - Iterable - Iterator - JavaScript - Operator - Reference translation_of: Web/JavaScript/Reference/Operators/yield* ---
Une expression yield*
est utilisée afin de déléguer le mécanisme d'itération/génération à un autre {{jsxref("Instructions/function*", "générateur")}} ou à un autre objet itérable.
Le code source de cet exemple interactif est disponible dans un dépôt GitHub. Si vous souhaitez contribuez à ces exemples, n'hésitez pas à cloner https://github.com/mdn/interactive-examples et à envoyer une pull request !
yield* [[expression]];
expression
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
).
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 }
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 }
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écification | État | Commentaires |
---|---|---|
{{SpecName('ES2015', '#sec-generator-function-definitions-runtime-semantics-evaluation', 'Yield')}} | {{Spec2('ES2015')}} | Définition initiale |
{{SpecName('ESDraft', '#sec-generator-function-definitions-runtime-semantics-evaluation', 'Yield')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.operators.yield_star")}}
yield
a été mise à jour pour être conforme aux spécifications ES2015 ({{bug(981599)}}) :
function* toto() { yield *[]; }