Автор оригинала: FreeCodeCamp Community Member.
Tiago Lopes Ferreira
ES6 вводит новый способ взаимодействия с помощью структур данных JavaScript – Итерация Отказ Давайте демистифицировать это.
Есть 2 основных концепция:
- ИТЕРИТЕЛЬНО – описан структурой данных, которая обеспечивает способ раскрытия своих данных на публику. Это делается путем внедрения метода, ключ которого является
Symbol.itereator
ОтказSymbol.itereator
это фабрика итераторов. - Итератор – описывается структурой, которая содержит указатель на следующий элемент в итерации.
Протокол
Как итератор, и ITERATOR Следуют протоколу, который позволяет объектам быть имеющим в действие:
- Соответственно Должен быть объектом с функцией итератором, ключ которого является
Symbol.itereator
Отказ
- итератор Должен быть объектом с функцией, названной
Следующий
Это возвращает объект с ключами:ценность
– текущий предмет в итерации; исделано
– правда Если итерация закончилась, ложь иначе.
Потери правности
Имеямость следит за идеей Источники данных и Потребители данных :
- Источники данных – Место из того, где потребители данных получают свои данные. Например,
Массив
такие как[1,2,3]
является структурой источника данных, которая содержит данные, через которые потребуется потребитель данных (например,1, 2 и 3
). Больше примеров –Строка
,Карты
иНаборы
Отказ - Потребители данных – Являются ли то, что потребляют данные из источников данных. Например,
для
Цикл – это потребитель данных, способный итерацию заМассив
источник данных. Больше примеров являютсяРаспространение оператора
иArray.rom
Отказ
Для структуры быть Источник данных , ему необходимо разрешить и сказать, как следует употреблять его данные. Это делается через Итераторы Отказ Поэтому, а Источник данных Нужно следовать протоколу итератору, описанному выше.
Тем не менее, это не практично для каждого Потребитель данных Чтобы поддержать все Источники данных Тем более, что JavaScript позволяет нам построить собственные источники данных. Так что ES6 представляет интерфейс ИТЕРИТЕЛЬНО Отказ
Потребители данных Потребляйте данные из Источники данных через по темпам Отказ
На практике
Давайте посмотрим, как это работает на определенном источнике данных – Массив
Отказ
ИТЕРАЛНЫЕ ИСТОЧНИКИ ДАННЫХ
Мы будем использовать для
Чтобы исследовать некоторые из источников данных, которые реализуют ИТЕРАЛНЫЙ ПРОТОКОЛЬКИ Отказ
Простые предметы
На этом этапе нам нужно сказать, что простой объекты не являются итерацией. Axel Rauschmayer отличная работа, объясняя почему на Исследуя ES6 Отказ
Краткое объяснение состоит в том, что мы можем повторять объекты JavaScript на двух разных уровнях:
- Уровень программы – что означает, что итерации по свойствам объекта, которые представляют его структуру. Например,
Array.prototype.length
, гдеДлина
связано с структурой объекта, а не в данных. - Уровень данных – означает, что итерация по структуре данных и извлечение его данных. Например, для нашего
Массив
Пример, это будет означать итерацию по данным массива. Еслимассив = [1,2,3,4]
, Итерация за ценности1, 2, 3 и 4
Отказ
Проблема с простыми объектами – это способность к тому, что всякая «создавать свои собственные объекты».
В приведении нашего Хьюго, как будет выделен JavaScript между уровнем данных, то есть. Hugo.fullname. и уровень программы, то есть. Hugo.tostring () ?
Хотя можно различить два уровня итерации на четко определенных структурах, таких как Массивы
, это невозможно сделать для любого объекта.
Вот почему мы получаем итерацию бесплатно на Массив
(Также на Строка
, Карта
и Set
) Но не на простых объектах.
Реализуйте показывать
Мы можем построить свои собственные итерасле, хотя обычно мы используем генераторы для этого.
Для того, чтобы построить наши собственные, нам нужно следовать итерационному протоколу, который говорит:
- Объект становится ИТЕРИТЕЛЬНО Если он реализует функцию, ключ которой является
Symbol.itereator
и возвращаетитератор
Отказ -
итератор
Сам объект с функцией под названиемСледующий
внутри него.Следующий
должен вернуть объект с двумя ключамиценность
исделано
Отказценность
Содержит следующий элемент итерации исделано
Флаг, говоря, если итерация закончилась.
Пример
Наша истеченная реализация очень проста. Мы следовали за ИТЕРАЛНЫЙ ПРОТОКОЛЬКИ и на каждой итерации для
Цикл спросит итератор для Следующий
элемент.
Наш итератор вернется на Следующий
Объект, содержащий следующее по итерации:
Обратите внимание, что мы переключаем заказ наших свойств Следующий
и сделано
для удобства. Наличие Следующий
Во-первых, он сломал бы реализацию, поскольку мы сначала поп-элемент, а затем подсчитаете элементы.
Полезно знать, что сделано
это ложь
По умолчанию, что означает, что мы можем игнорировать его, когда это так. То же самое верно для ценность
Когда сделано
это правда
Отказ
Мы увидим это через минуту.
Итератор как итеративный
Мы могли бы построить наш итератор как итеративный.
Обратите внимание, что это шаблон, за которым следует встроенные итераторы ES6.
Почему это полезно?
Хотя для
Работает только с меткой, а не с итераторами, тем же означает, что мы можем приостановить выполнение для
и продолжать после слова.
Возвращение и бросить
Есть два дополнительных метода итератора, которые мы еще не изучали:
Возвращаться
Возвращение
дает итератору возможность очистить дом, когда он неожиданно ломается. Когда мы называем Возвращение
На итераторе мы указываем, что мы не планируем звонить Следующий
больше.
Бросать
бросить
применяется только к генераторам. Мы увидим, что когда мы играем с генераторами.
Заключение
ES6 приносит итерацию как новый способ повторения структур данных JavaScript.
Для того, чтобы эта комбинация для работы гладко итерация определяется протоколом, который говорит:
-
ИТЕРИТЕЛЬНО
это объект, который реализует функцию, ключ которой являетсяSymbol.itereator
и возвращаетитератор
Отказ -
итератор
объект с функцией под названиемСледующий
внутри него.Следующий
это объект с двумя ключамиценность
исделано
Отказценность
Содержит следующий элемент итерации исделано
Флаг, говоря, если итерация закончилась.
Простые предметы не ИТЕРИТЕЛЬНО
Поскольку нет простого способа различить программу и итерацию уровня данных.
Вот почему ES6 предлагает способ создания собственных итераторов, следуя итератор
протокол.
Благодаря ?
- Axel Rauschmayer за его Исследуя ES6 – Итерация
- Николас Беваква за его Ponyfoo – ES6 итераторы в глубине
- Для всех Симпсоны поклонники
Обязательно проверьте мои другие статьи на ES6
Давайте исследуем генераторы ES6 Генераторы – это реализация повторных документов. medium.freecodeCamp.com.