Delegating to another generator (yield*)

We can use the yield* expression to delegate from one generator to another. The following code snippet defines two generator functions named g1 and g2. The g2 generator uses the yield* expression to delegate the iteration to the iterator created by g1:

function* g1() { 
    yield 2; 
    yield 3; 
    yield 4; 
} 
 
function* g2() { 
    yield 1; 
    yield* g1(); 
    yield 5; 
} 
 
var iterator1 = g2(); 
 
console.log(iterator1.next()); // {value: 1, done: false} 
console.log(iterator1.next()); // {value: 2, done: false} 
console.log(iterator1.next()); // {value: 3, done: false} 
console.log(iterator1.next()); // {value: 4, done: false} 
console.log(iterator1.next()); // {value: 5, done: false} 
console.log(iterator1.next()); // {value: undefined, done: true} 

The yield* expression can also be used to delegate the iteration to iterables, such as arrays:

function* g2() { 
    yield 1; 
    yield* [2, 3, 4]; 
    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}