Get to know MDN better
Esta página foi traduzida do inglês pela comunidade. Saiba mais e junte-se à comunidade MDN Web Docs.
This feature is well established and works across many devices and browser versions. It’s been available across browsers since julho de 2015.
O loop for...of percorre objetos iterativos (incluindo Array, Map, Set, o objeto arguments e assim por diante), chamando uma função personalizada com instruções a serem executadas para o valor de cada objeto distinto.
A cada iteração, um valor de uma propriedade diferente é atribuido à variável.
iteravelObjeto cujos atributos serão iterados.
Ao invés de let, você pode usar const se você não for modificar a variável dentro do bloco.
let iterable = [10, 20, 30]; for (const value of iterable) { console.log(value); } // 10 // 20 // 30Iterar sobre uma coleção do DOM como NodeList: o seguinte exemplo adiciona uma classe read aos parágrafos que são descendentes diretos de uma tag article:
// Nota: Isso irá funcionar somente em plataformas que tem // suporte ao NodeList.prototype[Symbol.iterator] let articleParagraphs = document.querySelectorAll("article > p"); for (let paragraph of articleParagraphs) { paragraph.classList.add("read"); }Você pode também iterar sobre generators:
function* fibonacci() { // uma função geradora (generator) let [prev, curr] = [1, 1]; while (true) { [prev, curr] = [curr, prev + curr]; yield curr; } } for (let n of fibonacci()) { console.log(n); // Trunca a sequência em 1000 if (n >= 1000) { break; } }Generators não devem ser re-usados, mesmo se o loop for...of for terminado precocemente, por exemplo através da palavra-chave break. Enquanto em um loop ativo, o generator é fechado e tentar iterar novamente sobre ele não produz (yield) nenhum resultado adicional. O Firefox ainda não implementou este comportamento (o generator pode ser reutilizado, violando o padrão do ES2015 (13.7.5.13, step 5m), mas isso irá mudar uma vez que o Erro do Firefox 1147371 for resolvido.
var gen = (function *(){ yield 1; yield 2; yield 3; })(); for (let o of gen) { console.log(o); break; // Closes iterator } // O generator não deve ser reutilizado, o código a seguir não // faz sentido! for (let o of gen) { console.log(o); // Nunca será chamado. }Você pode também iterar sobre um objeto que implementa explicitamente um protocolo iterável protocol:
var iterable = { [Symbol.iterator]() { return { i: 0, next() { if (this.i < 3) { return { value: this.i++, done: false }; } return { value: undefined, done: true }; } }; } }; for (var value of iterable) { console.log(value); } // 0 // 1 // 2O loop for...in irá iterar sobre todas as propriedades enumeráveis de um objeto.
A sintaxe do for...of é específica para coleções, ao invés de todos os objetos. Ela irá iterar desta maneira sobre os elementos de qualquer coleção que tiver uma propriedade [Symbol.iterator].
O exemplo a seguir mostra a diferença entre um loop for...of e um loop for...in.
Object.prototype.objCustom = function () {}; Array.prototype.arrCustom = function () {}; let iterable = [3, 5, 7]; iterable.foo = "hello"; for (let i in iterable) { console.log(i); // escreve 0, 1, 2, "foo", "arrCustom", "objCustom" } for (let i of iterable) { console.log(i); // escreve 3, 5, 7 }| ECMAScript® 2027 Language Specification # sec-for-in-and-for-of-statements |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 17 de dez. de 2024 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.