На этой странице:
https://javascript.info/iterable
Они объясняют, как работает итератор, создавая итератор с нуля:
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
this.current = this.from;
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
for (let num of range) {
alert(num); // 1, then 2, 3, 4, 5
}
По существу, итератор должен возвращать объект, подобный этому: {done: boolean, value: current value}
Затем он запускается, используя цикл for ...:
for (let num of range) {
alert(num); // 1, then 2, 3, 4, 5
}
Итак, мы знаем, что для ... of вызывает итератор и его следующую функцию. Мы просто знаем, что это работает. Но затем они объясняют, как мы можем вызвать их явно, с помощью этого кода:
let str = "Hello";
// does the same as
// for (let char of str) alert(char);
let iterator = str[Symbol.iterator]();
while (true) {
let result = iterator.next();
if (result.done) break;
alert(result.value); // outputs characters one by one
}
Но они вызывают итератор по умолчанию. Они не вызывают итератор, который они сделали с нуля. Я предполагаю, что это невозможно с тем, что они создали с нуля из-за того, как работает возврат. Так есть ли для ... из специальных функций, которые не могут быть воссозданы? Как будто он знает, что помнит, в каком значении вы находитесь, и продолжаете оттуда и не выходит при возврате.
Это просто, чтобы помочь моему пониманию. Мне всегда нравится, когда они объясняют, как воссоздать существующую функциональность, и хотят знать, можно ли ее полностью создать без использования итератора по умолчанию.