Iteration in JavaScript – The Iterator Pattern, Built-in Iterables, and Standard Data Consumption

Iteration is a foundational pattern for processing data in JavaScript. This article explores the iterator protocol, how to consume iterators using for..of loops and the spread operator, the distinction between iterators and iterables, and how built-in structures like arrays, strings, maps, and sets support standardized iteration. It also shows how to customize iteration for your own data structures.

spreadfor..ofiterableiterator

~2 دقیقه مطالعه · آخرین به‌روزرسانی ۲۸ مهر ۱۴۰۴

Introduction


Programs are built to process data, and the patterns used to iterate over that data greatly affect readability. The iterator pattern provides a standardized way to consume data one piece at a time, rather than all at once.


The Iterator Pattern


An iterator is a data structure that references a source and exposes a next() method. Each call to next() returns an object with value and done properties. Iteration continues until done becomes true.


Consuming Iterators with for..of


ES6 introduced the for..of loop for consuming iterators:


for (let val of it) {
  console.log(`Iterator value: ${val}`);
}

This loop is cleaner and more readable than manual iteration.


Using the Spread Operator


The ... operator also consumes iterators — either into arrays or function arguments:


var vals = [ ...it ];
doSomethingUseful(...it);

In both cases, the iterator is fully consumed and its values are spread into the target context.


What Is an Iterable?


An iterable is a value that can be iterated over. Each time it’s consumed, a new iterator instance is created. Built-in iterables in JS include arrays, strings, maps, sets, and more.


Examples of Iteration


var arr = [10, 20, 30];
for (let val of arr) {
  console.log(`Array value: ${val}`);
}

var greeting = "Hello world!";
var chars = [ ...greeting ];
// ["H", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"]

Iterating Over Maps


Maps iterate over entries — key/value pairs:


for (let [btn, btnName] of buttonNames) {
  btn.addEventListener("click", () => {
    console.log(`Clicked ${btnName}`);
  });
}

Customizing Iteration


You can use keys(), values(), or entries() to control what gets iterated:


for (let btnName of buttonNames.values()) {
  console.log(btnName);
}

for (let [idx, val] of arr.entries()) {
  console.log(`[${idx}]: ${val}`);
}

Standardizing Iteration


By following the iteration protocol, you can make your own data structures compatible with for..of and .... This leads to more readable and consistent code across your application.


Conclusion


Iteration in JavaScript is standardized through the iterator protocol and built-in iterable structures. Using for..of and the spread operator makes data consumption intuitive and clean. Understanding and applying these patterns is essential for writing modern, maintainable JS code.


نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

Coercive Conditional Comparison and Prototypal Classes in JavaScript – Understanding Implicit Logic and Legacy Inheritance Patterns

This article explores two advanced topics from Appendix A of You Don’t Know JS Yet: how JavaScript performs coercive comparisons in conditional expressions, and how prototypal class patterns were used before ES6 introduced the class keyword. Through practical examples, it clarifies how implicit boolean logic works and how prototype chains enable behavior delegation.

ادامه

Value vs Reference and the Many Forms of Function Definitions

Value vs Reference and the Many Forms of Function Definitions

ادامه

Prototypes in JavaScript – Delegation, Prototype Chains, and Dynamic this Behavior

Prototypes in JavaScript provide a mechanism for property delegation between objects. This article explains how prototype chains work, how to create linked objects using Object.create, and how property access and assignment behave in relation to delegation. It also explores how the dynamic nature of this enables prototype-based method reuse across multiple objects.

ادامه

Closure and this in JavaScript – Scope Memory and Dynamic Execution Context

Closure and this are two foundational and often misunderstood concepts in JavaScript. This article defines closure as a function’s ability to remember variables from its outer scope, and explains how this refers to the dynamic execution context of a function call. Through practical examples, it clarifies the difference between static scope and dynamic context.

ادامه

Modules in JavaScript – From Classic Patterns to ES Modules and Structural Differences

Modules in JavaScript, like classes, are designed to group data and behavior into logical units. This article explores the classic module pattern using factory functions, compares it to class-based design, and introduces ES Modules (ESM) introduced in ES6. It explains how modules are defined, exported, imported, and instantiated, and highlights the differences in structure and usage.

ادامه

Organizing Code in JavaScript – Classes, Modules, and Object-Oriented Inheritance

JavaScript offers two major patterns for organizing code: classes and modules. This article focuses on class-based design, including how to define and instantiate classes, encapsulate data and behavior, and use inheritance and polymorphism to extend functionality. Understanding these patterns helps developers write clean, maintainable, and scalable programs.

ادامه