Iteradores e Geradores

Iteráveis

Um objeto é considerado iterável se tiver uma implementação para a propriedade Symbol.iterator. Alguns tipos internos como Array, Map, Set, String, Int32Array, Uint32Array, etc. tem sua propriedade Symbol.iterator já implementadas. A função Symbol.iterator em um objeto é responsável por retornar a lista de valores para iterar.

Declarações for..of

for..of faz um loop em um objeto iterável, invocando a propriedade Symbol.iterator no objeto. Aqui está um loop for..of em uma matriz:

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

Declarações for..of vs. for..in

Ambas declarações for..of e for..in iteram em listas; os valores iterados são diferentes, porém, for..in retorna uma lista de chaves no objeto que está sendo iterado, enquanto for..of retorna uma lista de valores das propriedades numéricas do objeto que está sendo iterado.

Aqui está um exemplo que demonstra essa distinção:

ts
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
}

Outra distinção é que for..in opera em qualquer objeto; ele serve como uma forma de inspecionar propriedades neste objeto. for..of por outro lado, está principalmente interessado em valores de objetos iteráveis. Objetos integrados como propriedade Map e Set implementam a propriedade Symbol.iterator permitindo acesso a valores armazenados.

ts
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"
}

Geração de código

Visando ES5 E ES3

Ao direcionar um mecanismo compatível com ES5 ou ES3, os iteradores são permitidos apenas em valores do tipo Array. É um erro usar loops for..of em valores que não sejam Array, mesmo se esses valores não-Array implementarem a propriedade Symbol.iterator.

O compilador irá gerar um loop for simples para um loop for..of, por exemplo:

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

será gerado como:

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

Visando ECMAScript 2015 e superior

Ao direcionar um mecanismo compatível com ECMAScipt 2015, o compilador irá gerar loops for..of para direcionar a implementação do iterador integrado no mecanismo.

The TypeScript docs are an open source project. Help us improve these pages by sending a Pull Request

Contributors to this page:
MHMohamed Hegazy  (57)
WLWeslley Luiz  (7)
GBGabriel Burdeti  (3)
OTOrta Therox  (2)
KSKevin Sanders  (1)
7+

Last updated: 24 de jun. de 2022