Что такое паттерн Iterator и зачем он нужен?
Поведенческие паттерны
Iterator даёт последовательный доступ к элементам коллекции, не раскрывая её внутреннее устройство: массив, дерево и поток обходятся единообразно.
Контракт
next()возвращает элемент или сигнал конца; в большинстве языков итератор встроен в протокол циклаfor x in collection.- Итератор — объект с состоянием (позицией): обход можно приостановить и продолжить.
Зачем он нужен
- Клиент не зависит от представления: обход дерева в глубину выглядит как обход списка.
- Ленивость: итератор по файлу или бесконечной последовательности не материализует данные целиком — на этом построены генераторы.
- Несколько независимых обходов одной коллекции одновременно.
Нюансы
- Модификация коллекции во время обхода: fail-fast итераторы бросают исключение, snapshot-итераторы идут по копии.
- Внешний итератор (им управляет клиент) против внутреннего (коллекция сама гоняет коллбэк, как forEach).
Коротко для собеседования
Iterator — курсор с методом next(), который обходит любую структуру одинаково и не раскрывает её устройство. В JS это протокол Symbol.iterator, на нём работают for-of, spread и генераторы; главные ловушки — изменение коллекции во время обхода и повторное использование одноразового итератора.