Чтобы объект реализовал итерируемый интерфейс, он должен реализовать ключ [Symbol.iterator]
, указывающий на функцию, возвращающую iterator
. Мне интересно, вызывает ли цикл for..of
этот метод внутри объекта, чтобы получить этот iterator
?
Причина, по которой мне любопытно, заключается в том, что, например, Map
определяет интерфейс с несколькими итераторами (записями, значениями, ключами), и кажется, что если не указано явно, цикл for..of
использует итератор, возвращенный вызовом map.entries()
.
Я пытаюсь найти в спецификации, но указывает только, что iterator
передается в качестве параметра абстрактной операции ForOf
:
Абстрактная операция ForIn/OfBodyEvaluation вызывается с аргументами lhs, stmt, iterator, iterationKind, lhsKind и labelSet.
Итак, в основном два вопроса:
- Как итератор получается из объекта?
- Где это указано в спецификации?
map.entries()
. - не совсем так. Он всегда используетmap[Symbol.iterator]()
, , который является тот же метод, что иentries
. Если вы передаете объект итератора, он также вызывает…[Symbol.iterator]()
для них, просто метод возвращает сам объект (return this;
) для экземпляров итератора. - person Bergi   schedule 10.10.2017