Iterables and iterators are concepts in JavaScript that enable the traversal of data structures, allowing you to loop or iterate through their elements. These concepts are fundamental to many features in JavaScript, such as for...of
loops and the spread/rest syntax.
An iterable is an object that has an associated iterator. Arrays, strings, maps, sets, and other built-in JavaScript objects are examples of iterables. To be iterable, an object must implement the Symbol.iterator
method, which returns an iterator.
Example:
// Array is an iterable
const myArray = [1, 2, 3];
// String is an iterable
const myString = "Hello";
// Map is an iterable
const myMap = new Map([
['key1', 'value1'],
['key2', 'value2']
]);
Iterators:
An iterator is an object that provides a next
method, which returns the next value in the sequence along with information about whether the end of the sequence has been reached. The next
method returns an object with two properties: value
(the next value) and done
(a boolean indicating if the iteration is complete).
Example:
// Array iterator
const arrayIterator = myArray[Symbol.iterator]();
console.log(arrayIterator.next()); // { value: 1, done: false }
console.log(arrayIterator.next()); // { value: 2, done: false }
console.log(arrayIterator.next()); // { value: 3, done: false }
console.log(arrayIterator.next()); // { value: undefined, done: true }
Using for...of
Loop:
The for...of
loop is a convenient way to iterate over the values of an iterable. It automatically calls the iterator's next
method until done
is true
.
Example:
for (const element of myArray) {
console.log(element);
}
// Output:
// 1
// 2
// 3
Custom Iterables:
You can create custom iterables by defining the Symbol.iterator
method on your objects.
Example:
const customIterable = {
data: [4, 5, 6],
[Symbol.iterator]: function () {
let index = 0;
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
for (const element of customIterable) {
console.log(element);
}
// Output:
// 4
// 5
// 6
Understanding iterables and iterators is crucial for effective JavaScript programming, especially when working with loops, generators, and other constructs that involve the traversal of data structures. The use of these concepts makes it easier to work with various types of data in a consistent and flexible manner.