Spec-Zone.ru › TypeScript 5.1

Итераторы и генераторы

Итерируемые объекты

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

Iterable интерфейс

Iterable — это тип, который можно использовать, если требуется работа с вышеперечисленными итерируемыми типами. Вот пример:

function toArray<X>(xs: Iterable<X>): X[] {
  return [...xs]
}

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 и выше

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

© 2012-2023 Microsoft
Licensed under the Apache License, Version 2.0.
https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API