01. Iterable
В JavaScript добавлена новая концепция “итерируемых” (iterable) объектов:
Итерируемый объект (Iterable) - это объект или структура данных, чьи элементы должны быть доступны для последовательного перебора. Сама структура данных не обязательно должна быть линейной, но во время итерации элементы из неё извлекаются в последовательном порядке. Итерируемый объект содержит метод, доступный по символу
Symbol.iterator
. Этот метод является фабрикой для объектов-итераторов.Итератор (Iterator) - объект, реализующий специальный протокол, для обхода элементов в структуре данных. Итераторы используются в тех местах, где нужно передать последовательность данных дальше по назначению -
for-of
,spread
.
Следующие объекты являются итерируемыми:
arguments
Array
String
Set
Map
DOM структуры
Пользовательские объекты, имеющие символ-итератор.
В следующих операциях используется итератор:
Деструкция на основе паттерна массива
for-of
циклArray.from
Spread (
...
)Constructors of Maps and Sets
Promise.all()
,Promise.race()
yield*
На основе итераторов работает множество языковых конструкций, добавленных в ES6:
Особенности итератора:
Является ли объект итерируемым зависит от наличия на нем метода с ключом
Symbol.iterator
, который возвращает валидный итератор.Обычные объекты не являются итерируемыми.
В отличие от массивов, “перебираемые” объекты могут не иметь “длины”
length
.Возможны и бесконечные итераторы. Нет никаких ограничений на
next
, он может возвращать всё новые и новые значения, и это нормально.Оператор
spread
автоматически превращает итерируемый объект в массив:Math.max(...range);
Если сам объект реализует протокол итератора, тогда и вызов функции-итератора должен просто возвращать
this
.Является ли итератор закрываемым?
Генераторы являются закрываемыми по умолчанию.
Не все итераторы сами являются итерируемыми. То есть не на всех итераторах определен
Symbol.iterator
возвращающийthis
.
Last updated
Was this helpful?