Symbol.iterator
устанавливает поведение при итерации объекта. В случае с
for..of
метод
next
вызывается неявно. Но его присутствие и вид возвращаемого объекта с полями
value
и
done
обязывает протокол итератора. В
value
содержится текущее значение, которое попадает в переменную
n
, а в
done
указан флаг окончания итерации.
Тот же самый протокол используется, к примеру, в генераторах:
function fibonacci(max) {
return {
[Symbol.iterator]: function* iterator() {
let prev = 0
let cur = 1
while (true) {
[prev, cur] = [cur, prev + cur]
if (cur > max) {
return cur
}
yield cur
}
}
}
}
[...fibonacci(1500)] // Массив с числами Фибоначчи с ограничением «1500»
// Но при этом...
const iterable = fibonacci(1500)[Symbol.iterator]()
iterable.next() // {value: 1, done: false}