В ECMAScript 6 была добавлена новая концепция «итерируемых» объектов, т.н. итераторов. Итерируемые или, иными словами, «перебираемые» объекты – это те, содержимое которых можно перебрать в цикле.
Для перебора таких объектов добавлен новый синтаксис цикла: for..of
.
// ECMAScript 6
const arr = [1, 2, 3];
for (let value of arr) {
console.log(value);
}
// Ожидаемый результат: 1 -> 2 -> 3
Итераторы – расширяющая понятие «массив» концепция, которая пронизывает современный стандарт JavaScript сверху донизу.
Вот как выглядит простой итератор изнутри:
// ECMAScript 6
const iterator = {
[Symbol.iterator]: function() {
return this;
},
next: function() {
return {value: 0, done: false};
},
};
Цикл for..of
начинается с вызова метода [Symbol.iterator]()
на коллекции.
Он возвращает объект-итератор. Итератором может быть любой объект с методом
next()
, и цикл for..of
будет вызывать этот метод раз за разом, по-одному
за один проход цикла.
Всякий раз, как метод next()
вызывается, он возвращает один и тот же результат,
сообщая циклу for..of
, что: итерирование ещё не закончено, следующее значение — 0.
Это означает, что for (value of iterator) {}
будет бесконечным циклом.
Разумеется, типичный итератор не будет таким тривиальным.
Практически везде, где нужен перебор, он осуществляется через итераторы. Это включает
в себя не только строки, массивы, но и вызов функции с оператором Spread
f(...args)
,
и многое другое.
В отличие от массивов, перебираемые объекты могут не иметь «длины» length
.
Более подробно узнать про итераторы можно на MDN.