Cette page a été traduite à partir de l'anglais par la communauté.Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
yield*
Baseline Widely available
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis septembre 2016.
Uneexpressionyield* est utilisée afin de déléguer le mécanisme d'itération/génération à un autregénérateur ou à un autre objet itérable.
Dans cet article
Exemple interactif
function* func1() { yield 42;}function* func2() { yield* func1();}const iterator = func2();console.log(iterator.next().value);// Expected output: 42Syntaxe
yield * expression;expressionL'expression qui renvoie un objet itérable.
Description
L'expressionyield* itère sur l'opérande et génère chaque valeur générée par l'opérande.
La valeur de l'expressionyield* est la valeur renvoyée par l'itérateur lorsque celui est terminé (la propriétédone vauttrue).
Exemples
>Délégation de la génération
Dans le code suivant, les valeurs générées parg1() sont renvoyées grâce aux appels à la fonctionnext(), comme pour celles renvoyées parg2().
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 pointconsole.log(résultat); // "toto"Spécifications
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-generator-function-definitions-runtime-semantics-evaluation> |
Compatibilité des navigateurs
Voir aussi
- Le protocole itérateur
- L'instruction
function* - L'expression
function* yield