Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

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⁩.

>

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.

Exemple interactif

function* func1() {
  yield 42;
}

function* func2() {
  yield* func1();
}

const iterator = func2();

console.log(iterator.next().value);
// Expected output: 42

Syntaxe

js
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().

js
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) :

js
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 :

js
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

Specification
ECMAScript® 2026 Language Specification>
# sec-generator-function-definitions-runtime-semantics-evaluation>

Compatibilité des navigateurs

Voir aussi