Stage 3 Draft / January 12, 2026
Joint Iteration
1 Iterator.zip ( iterables [ , options ] )
This method performs the following steps when called:
- If iterables is not an Object, throw a TypeError exception.
- Set options to ? GetOptionsObject(options).
- Let mode be ? Get(options, "mode").
- If mode is undefined, set mode to "shortest".
- If mode is not one of "shortest", "longest", or "strict", throw a TypeError exception.
- Let paddingOption be undefined.
- If mode is "longest", then
- Set paddingOption to ? Get(options, "padding").
- If paddingOption is not undefined and paddingOption is not an Object, throw a TypeError exception.
- Let iters be a new empty List.
- Let padding be a new empty List.
- Let inputIter be ? GetIterator(iterables, sync).
- Let next be not-started.
- Repeat, while next is not done,
- Set next to Completion(IteratorStepValue(inputIter)).
- IfAbruptCloseIterators(next, iters).
- If next is not done, then
- Let iter be Completion(GetIteratorFlattenable(next, reject-primitives)).
- IfAbruptCloseIterators(iter, the list-concatenation of « inputIter » and iters).
- Append iter to iters.
- Let iterCount be the number of elements in iters.
- If mode is "longest", then
- If paddingOption is undefined, then
- Perform the following steps iterCount times:
- Append undefined to padding.
- Else,
- Let paddingIter be Completion(GetIterator(paddingOption, sync)).
- IfAbruptCloseIterators(paddingIter, iters).
- Let usingIterator be true.
- Perform the following steps iterCount times:
- If usingIterator is true, then
- Set next to Completion(IteratorStepValue(paddingIter)).
- IfAbruptCloseIterators(next, iters).
- If next is done, then
- Set usingIterator to false.
- Else,
- Append next to padding.
- If usingIterator is false, append undefined to padding.
- If usingIterator is true, then
- Let completion be Completion(IteratorClose(paddingIter, NormalCompletion(unused))).
- IfAbruptCloseIterators(completion, iters).
- Let finishResults be a new Abstract Closure with parameters (results) that captures nothing and performs the following steps when called:
- Return CreateArrayFromList(results).
- Return IteratorZip(iters, mode, padding, finishResults).
2 Iterator.zipKeyed ( iterables [ , options ] )
This method performs the following steps when called:
- If iterables is not an Object, throw a TypeError exception.
- Set options to ? GetOptionsObject(options).
- Let mode be ? Get(options, "mode").
- If mode is undefined, set mode to "shortest".
- If mode is not one of "shortest", "longest", or "strict", throw a TypeError exception.
- Let paddingOption be undefined.
- If mode is "longest", then
- Set paddingOption to ? Get(options, "padding").
- If paddingOption is not undefined and paddingOption is not an Object, throw a TypeError exception.
- Let iters be a new empty List.
- Let padding be a new empty List.
- Let allKeys be ? iterables.[[OwnPropertyKeys]]().
- Let keys be a new empty List.
- For each element key of allKeys, do
- Let desc be Completion(iterables.[[GetOwnProperty]](key)).
- IfAbruptCloseIterators(desc, iters).
- If desc is not undefined and desc.[[Enumerable]] is true, then
- Let value be Completion(Get(iterables, key)).
- IfAbruptCloseIterators(value, iters).
- If value is not undefined, then
- Append key to keys.
- Let iter be Completion(GetIteratorFlattenable(value, reject-primitives)).
- IfAbruptCloseIterators(iter, iters).
- Append iter to iters.
- Let iterCount be the number of elements in iters.
- If mode is "longest", then
- If paddingOption is undefined, then
- Perform the following steps iterCount times:
- Append undefined to padding.
- Else,
- For each element key of keys, do
- Let value be Completion(Get(paddingOption, key)).
- IfAbruptCloseIterators(value, iters).
- Append value to padding.
- Let finishResults be a new Abstract Closure with parameters (results) that captures keys and iterCount and performs the following steps when called:
- Let obj be OrdinaryObjectCreate(null).
- For each integer i such that 0 ≤ i < iterCount, in ascending order, do
- Perform ! CreateDataPropertyOrThrow(obj, keys[i], results[i]).
- Return obj.
- Return IteratorZip(iters, mode, padding, finishResults).
3 IteratorZip ( iters, mode, padding, finishResults )
The abstract operation IteratorZip takes arguments iters (a List of Iterator Records), mode (either "shortest", "longest", or "strict"), padding (a List of ECMAScript language values), and finishResults (an Abstract Closure that takes a List of ECMAScript values and returns an ECMAScript value) and returns a Generator. It performs the following steps when called:
- Let iterCount be the number of elements in iters.
- Let openIters be a copy of iters.
- Let closure be a new Abstract Closure with no parameters that captures iters, iterCount, openIters, mode, padding, and finishResults, and performs the following steps when called:
- If iterCount = 0, return ReturnCompletion(undefined).
- Repeat,
- Let results be a new empty List.
- Assert: openIters is not empty.
- For each integer i such that 0 ≤ i < iterCount, in ascending order, do
- Let iter be iters[i].
- If iter is null, then
- Assert: mode is "longest".
- Let result be padding[i].
- Else,
- Let result be Completion(IteratorStepValue(iter)).
- If result is an abrupt completion, then
- Remove iter from openIters.
- Return ? IteratorCloseAll(openIters, result).
- Set result to ! result.
- If result is done, then
- Remove iter from openIters.
- If mode is "shortest", then
- Return ? IteratorCloseAll(openIters, ReturnCompletion(undefined)).
- Else if mode is "strict", then
- If i ≠ 0, then
- Return ? IteratorCloseAll(openIters, ThrowCompletion(a newly created TypeError object)).
- For each integer k such that 1 ≤ k < iterCount, in ascending order, do
- Assert: iters[k] is not null.
- Let open be Completion(IteratorStep(iters[k])).
- If open is an abrupt completion, then
- Remove iters[k] from openIters.
- Return ? IteratorCloseAll(openIters, open).
- Set open to ! open.
- If open is done, then
- Remove iters[k] from openIters.
- Else,
- Return ? IteratorCloseAll(openIters, ThrowCompletion(a newly created TypeError object)).
- Return ReturnCompletion(undefined).
- Else,
- Assert: mode is "longest".
- If openIters is empty, return ReturnCompletion(undefined).
- Set iters[i] to null.
- Set result to padding[i].
- Append result to results.
- Set results to finishResults(results).
- Let completion be Completion(Yield(results)).
- If completion is an abrupt completion, then
- Return ? IteratorCloseAll(openIters, completion).
- Let gen be CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterators]] »).
- Set gen.[[UnderlyingIterators]] to openIters.
- Return gen.
4 IfAbruptCloseIterators ( value, iteratorRecords )
IfAbruptCloseIterators is a shorthand for a sequence of algorithm steps that use a list of Iterator Records. An algorithm step of the form:
- IfAbruptCloseIterators(value, iteratorRecords).
means the same thing as:
- Assert: value is a Completion Record.
- If value is an abrupt completion, return ? IteratorCloseAll(iteratorRecords, value).
- Else, set value to value.[[Value]].