Table of Contents #

# Итерируемые элементы

Итерируемым является такой объект, который содержит реализацию свойства Symbol.iterator. Некоторые встроенный типы, такие как Array, Map, Set, String, Int32Array, Uint32Array и т.д., содержат уже реализованное свойство Symbol.iterator. Взятая от объекта функция Symbol.iterator должна возвратить список значений для организации цикла.

Оператор for..of

Для перебора итерируемого объекта в цикле for..of, на нём вызывается свойство Symbol.iterator. Вот простой пример прохождения цикла for..of по массиву:

let someArray = [1, "string", false];

for (let entry of someArray) {
    console.log(entry); // 1, "string", false
}

for..of против for..in

И for..of, и for..in используются для перебора списков. При этом значения, по которым выполняется обход, различаются. for..in возвращает список ключей итерируемого объекта, когда как for..of возвращает список значений его числовых свойств.

Следующий пример демонстрирует различие:

let list = [4, 5, 6];

for (let i in list) {
   console.log(i); // "0", "1", "2",
}

for (let i of list) {
   console.log(i); // "4", "5", "6"
}




Ещё одно различие заключается в том, что for..in может использоваться для обхода любого объекта, являясь средством инспектирования его свойств. А for..of в первую очередь предназначен для получения значений. Такие встроенные объекты, как Map и Set, реализуют свойство Symbol.iterator, предоставляя с его помощью доступ к хранимым значениям.

let pets = new Set(["Cat", "Dog", "Hamster"]);
pets["species"] = "mammals";

for (let pet in pets) {
   console.log(pet); // "species"
}

for (let pet of pets) {
    console.log(pet); // "Cat", "Dog", "Hamster"
}

Генерация кода

Соответствие ES5 и ES3

Если целевым стандартом являются ES5 или ES3, допускается использование итераторов только для объектов типа Array. Попытка обхода объектов других типов с помощью for..of будет ошибкой, даже если эти объекты реализуют свойство Symbol.iterator.

Компилятор сгенерирует простой цикл for вместо цикла for..of, например:

let numbers = [1, 2, 3];
for (let num of numbers) {
    console.log(num);
}

будет сгенерировано в виде:

var numbers = [1, 2, 3];
for (var _i = 0; _i < numbers.length; _i++) {
    var num = numbers[_i];
    console.log(num);
}

Соответствие ECMAScript 2015 и выше

В том случае, если целевым стандартом является ECMAScipt 2015, компилятор сгенерирует циклы for..of в соответствии со встроенной в движок реализацией итераторов.

Источник







Поддержите перевод документации:



Поддерживатель | Github Репозиторий


Documentation generated by mdoc.
Молния! Обновления, новости и статьи Typescript.