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?