Я не думаю, что знание о том, как это реализовано, использовалось бы для того, чтобы на самом деле перебирать вещи. В этом нет никакого преимущества перед использованием for для l oop.
Но предположим, что вы создаете библиотеку JavaScript, например драйвер Node.js для базы данных MongoDB. Вы хотите упростить запрос к базе данных и l oop по результатам. Вы реализуете итерируемый протокол , и тогда люди могут сделать это:
const cursor = queryDatabase(<some query>)
for (let doc of cursor) {
// do something with doc
}
На самом деле, Драйвер MongoDB действительно делает это (за исключением того, что они реализуют асинхронный доступ). c итератор).
РЕДАКТИРОВАТЬ: Обратите внимание на преимущество использования протокола итератора по сравнению с возвращением массива-подобного объекта из queryDatabase()
. В частности, в MongoDB cursor
не содержит всех результатов. Это дескриптор, и результаты запроса могут быть получены путем вызова cursor.next()
Проблема с необходимостью вызова cursor.next()
заключается в том, что он довольно неуклюж, как вы указали в вопросе. Тем не менее, это хорошо, потому что не все результаты должны быть получены из базы данных, которых может быть тысячи. Таким образом, протокол итератора - это способ сохранить преимущества cursor.next()
без необходимости иметь дело с уродливым синтаксисом.