Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
Одно из нововведений стандарта ECMAScript 2015 - протоколы перебора, которые могут реализованы любым объектом, соблюдая при этом определённые правила.
Протоколы перебора включают the "iterable" protocol и the "iterator" protocol.
Протокол "Итерируемый" позволяет JavaScript объектам определять или настраивать поведение перебора, например, то какие значения перебираются в конструкции for..of. Некоторые встроенные типы, такие как Array или Map, имеют поведение перебора по умолчанию, в то время как другие типы (такие как Object) его не имеют
Для того, чтобы объект был итерируемым, в нем должен быть реализован метод @@iterator, т.е. этот объект (или любой из объектов из его prototype chain) должен иметь свойство с именем Symbol.iterator:
| [Symbol.iterator] | Функция без аргументов, возвращающая объект, соответствующий iterator protocol. |
Всякий раз, когда объект подлежит перебору (например, когда в коде встречается цикл for..of), вызывается его метод @@iterator без аргументов, и возвращаемый iterator используется для получения перебираемых значений.
Протокол "Итератор" определяет стандартный способ получения последовательности значений (конечной или бесконечной).
Объект является итератором, если в нем определён метод next() , реализующий следующую логику:
| next |
Функция без аргументов, возвращающая объект с двумя свойствами:
|
Некоторые итераторы, в свою очередь, итерабельны:
String является примером встроенного итерабельного объекта:
По умолчанию итератор строки возвращает символы строки друг за другом:
Некоторые встроенные конструкции языка, например, spread operator, используют в своей внутренней реализации тот же протокол итерации:
Поведение итератора можно переопределить применив собственный @@iterator:
Notice how redefining @@iterator affects the behavior of built-in constructs, that use the iteration protocol:
String, Array, TypedArray, Map и Set итерируемы, так как их прототипы содержат @@iterator метод, а Object нет, так как прототип Object не содержит метода @@iterator
Мы можем создать итерируемый объект сами:
Map([iterable]), WeakMap([iterable]), Set([iterable]) and WeakSet([iterable]):
and Promise.all(iterable), Promise.race(iterable), Array.from()
for-of, spread, yield*, destructing - использование данного синтаксиса возможно только если типы данных, к которым он применяется, итерируемы:
If an iterable's @@iterator method doesn't return an iterator object, then it's a non-well-formed iterable, using it as such is likely to result in runtime exceptions or buggy behavior:
И тем и другим
| ECMAScript® 2027 Language Specification # sec-iteration |
This page was last modified on 24 мар. 2025 г. by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.