Почему итератор нужно делать итерируемым?

В программировании итератор является объектом, который предоставляет последовательный доступ к элементам коллекции или контейнера данных. Итераторы имеют ряд преимуществ, таких как возможность обхода элементов коллекции в определенном порядке и доступа к элементам коллекции без явного знания о ее структуре.

Один из важных аспектов работы с итераторами в JavaScript заключается в том, что итераторы должны быть итерируемыми. Зачем это нужно?

1. Согласованность интерфейса: Когда итератор является итерируемым, это означает, что он подчиняется определенному интерфейсу. А это, в свою очередь, позволяет нам использовать его в любом месте, где ожидается итерируемый объект. Такой подход приводит к согласованности интерфейсов и более гибкому коду.

2. Циклы for-of: Благодаря тому, что итератор является итерируемым, его можно использовать в цикле for-of. Цикл for-of предоставляет удобный способ обращения к элементам коллекции без необходимости следить за индексами или другими деталями реализации итератора.

Пример использования цикла for-of с итерируемым объектом:

const myIterable = {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
};

for (const value of myIterable) {
  console.log(value);
}
// Вывод:
// 1
// 2
// 3

3. Возможность создания нескольких итераторов: Итераторы, которые являются итерируемыми, могут быть созданы множество раз для одной и той же коллекции данных. Это означает, что мы можем обходить коллекцию несколькими разными способами, если это необходимо.

Пример создания нескольких итераторов:

const myIterable = {
  items: [1, 2, 3],
  *[Symbol.iterator]() {
    for (const item of this.items) {
      yield item;
    }
  }
};

const iterator1 = myIterable[Symbol.iterator]();
const iterator2 = myIterable[Symbol.iterator]();

console.log(iterator1.next().value);
// Вывод: 1

console.log(iterator1.next().value);
// Вывод: 2

console.log(iterator2.next().value);
// Вывод: 1

console.log(iterator2.next().value);
// Вывод: 2

4. Унифицированный подход к работе с коллекциями: Использование итерируемого объекта позволяет нам создавать унифицированный подход к работе с различными типами коллекций. Например, мы можем использовать один и тот же код для обхода массива, строки или другой коллекции данных. Это делает код более читаемым и легко поддерживаемым.

Итак, итераторы следует делать итерируемыми, чтобы обеспечить согласованность интерфейса, использовать их в цикле for-of, создавать несколько итераторов для одной коллекции и использовать унифицированный подход к работе с коллекциями. Это позволяет нам писать более гибкий, поддерживаемый и переиспользуемый код.