Skip to main content
JavaScript & the browser·Module C6 · Lesson 6
TaskDefine function* odds() yielding 1,3,5 and function* evens() yielding 2,4,6. Use yield* in function* both() to concatenate them. Then write function* walk(node) yielding node.value then walking each child recursively. Log [...both()].join(',') and [...walk({value:'a',children:[{value:'b',children:[{value:'c'}]}]})].join('>').

yield* — delegating to another iterable

125 XP8 min
Theory

What yield* does

yield* otherIterable yields every value from another iterable in place. Same effect as a manual for-of with yield, but built into the syntax.

function* head() { yield 1; yield 2; }
function* tail() { yield 3; yield 4; }

function* both() {
  yield* head();
  yield* tail();
}

console.log([...both()]); // [1, 2, 3, 4]

Recursion

yield* recurses naturally. A tree walker in five lines:

function* walk(node) {
  yield node.value;
  for (const child of node.children ?? []) {
    yield* walk(child);
  }
}

A flat for-of walk(root) traverses the whole tree depth-first. No manual stack, no helper class.

Versus calling .next() in a loop

yield* x correctly forwards return values, .throw(), and stops when the inner iterable is done. The manual version is bug-prone — every helper file has a story about doing it manually and getting it wrong.

🔒

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial — card required, cancel anytime.

Sign up — free trial →

First 10 lessons in each track are free. No card needed for those.

PreviousNext lesson →

Get one Python or web tip a day — by email

Short, hand-written, no spam. Unsubscribe in one click.