JavaScript forEach: Como Iterar Arrays com Eficiência
O JavaScript forEach é um dos recursos mais utilizados para percorrer arrays em aplicações web modernas. Ele permite executar uma função para cada elemento de uma coleção, tornando o código mais legível, declarativo e fácil de manter em diversas situações. Seja para renderizar uma lista na interface, calcular valores, registrar dados no console ou atualizar propriedades de objetos, compreender o funcionamento do forEach() é essencial para quem deseja dominar o laço JS. Neste artigo, você aprenderá a sintaxe, os parâmetros, os casos de uso, as limitações e as diferenças entre esse método e outras alternativas de iteração em JavaScript.
Como funciona o JavaScript forEach na prática
O método forEach() pertence ao protótipo de arrays. Isso significa que todo array JavaScript pode chamá-lo para executar uma função de retorno, conhecida como callback, uma vez para cada item existente na coleção. A execução acontece na ordem crescente dos índices: primeiro o elemento na posição zero, depois o da posição um e assim sucessivamente.
A sintaxe básica é simples:
const tecnologias = ['JavaScript', 'HTML', 'CSS'];
tecnologias.forEach(function (tecnologia) {
console.log(tecnologia);
});Nesse exemplo, a função é acionada três vezes. Em cada execução, o parâmetro tecnologia recebe o valor correspondente do array. O resultado no console será a impressão de JavaScript, HTML e CSS em linhas separadas. Em projetos atuais, é comum empregar uma arrow function, que oferece uma escrita mais concisa:
tecnologias.forEach((tecnologia) => {
console.log(tecnologia);
});Além do valor atual, o callback do forEach JavaScript pode receber o índice e o próprio array. Esses argumentos são úteis quando a lógica depende da posição do item ou quando é necessário consultar a coleção original.
const notas = [7.5, 8.0, 9.2];
notas.forEach((nota, indice, arrayOriginal) => {
console.log(`Nota ${indice + 1}: ${nota}`);
console.log(`Total de registros: ${arrayOriginal.length}`);
});A assinatura completa pode ser representada como array.forEach(callback(elemento, indice, array), thisArg). O segundo parâmetro, thisArg, é opcional e permite definir o valor de this dentro do callback quando são utilizadas funções tradicionais. Contudo, seu uso é menos frequente em código contemporâneo, especialmente com funções de seta, que possuem comportamento próprio para this.
É importante observar que forEach() não altera o array automaticamente. Se o callback apenas lê ou exibe os elementos, a coleção permanece intacta. Porém, alterações diretas em objetos contidos no array ou atribuições por índice podem modificar seus dados. Por isso, a intenção do código deve estar clara: use o método principalmente para executar ações em cada item, e não para produzir um novo array transformado.
Outro ponto relevante é que o forEach() ignora posições vazias em arrays esparsos. Por exemplo, em um array criado com lacunas, o callback não será chamado para os índices que não possuem elemento atribuído. Esse detalhe pode evitar comportamentos inesperados ao trabalhar com dados incompletos. A documentação da MDN Web Docs sobre Array.prototype.forEach() apresenta as regras formais, a compatibilidade e exemplos adicionais do método.
Aplicações comuns para iterar array com forEach
Na rotina de desenvolvimento, o forEach() é particularmente adequado quando cada item precisa provocar um efeito específico. Um efeito pode ser imprimir informações, preencher uma estrutura existente, inserir elementos no DOM, atualizar um objeto de controle ou enviar dados a uma função. Considere uma lista de produtos recebida de uma API:
const produtos = [
{ nome: 'Teclado', preco: 180 },
{ nome: 'Mouse', preco: 95 },
{ nome: 'Monitor', preco: 1200 }
];
produtos.forEach((produto) => {
console.log(`${produto.nome}: R$ ${produto.preco}`);
});Em uma página HTML, o mesmo conceito pode ser aplicado à criação de itens visuais. Embora frameworks como React, Vue e Angular possuam padrões próprios de renderização, o JavaScript puro continua importante para compreender a base da manipulação de interfaces:
const lista = document.querySelector('#lista-produtos');
produtos.forEach((produto) => {
const item = document.createElement('li');
item.textContent = produto.nome;
lista.appendChild(item);
});Esse padrão é eficiente para conjuntos pequenos ou moderados de elementos. Para listas muito extensas, é recomendável reduzir manipulações repetidas do DOM, utilizando recursos como DocumentFragment ou técnicas de paginação e virtualização. Assim, o uso correto do laço JS deve considerar não apenas a sintaxe, mas também o impacto na experiência do usuário.
O método também pode ser utilizado para acumular resultados em uma variável externa. Ainda assim, quando a intenção central for obter um único valor, reduce() costuma comunicar melhor essa finalidade. Da mesma forma, se a intenção for converter todos os elementos em outra coleção, map() é geralmente a escolha mais semântica. Escolher o método certo melhora a leitura e reduz erros durante a manutenção.
Boas práticas ao utilizar o método
- Use forEach para efeitos colaterais: prefira-o para exibir dados, atualizar o DOM, registrar logs ou alimentar uma estrutura já existente.
- Prefira map para transformações: quando precisar retornar um novo array com valores alterados,
map()torna a intenção explícita. - Não espere um retorno útil: o resultado de
forEach()é sempreundefined; portanto, ele não deve ser encadeado esperando uma nova coleção. - Evite async/await diretamente no callback: o método não aguarda as Promises criadas pelo callback assíncrono. Para processamento sequencial assíncrono, use
for...of. - Não utilize break ou continue: essas instruções não funcionam para interromper ou pular a execução de um callback de
forEach(). - Valide os dados de entrada: certifique-se de que a variável é realmente um array antes de chamar o método, especialmente em respostas de APIs.
- Escolha nomes descritivos: parâmetros como
usuario,pedidoeprodutofacilitam o entendimento do código.
Uma prática importante é evitar a alteração estrutural do array durante a iteração. Adicionar ou remover itens enquanto o forEach() está em andamento pode gerar resultados difíceis de prever, pois o método define o intervalo de índices antes de iniciar as chamadas. Em vez disso, faça as mudanças depois do processamento ou trabalhe com uma cópia da coleção quando necessário.
forEach, for, for...of e map: comparação essencial
| Método | Finalidade principal | Retorna novo array? | Permite interrupção? | Melhor cenário |
|---|---|---|---|---|
forEach() | Executar uma ação para cada item | Não | Não | Logs, DOM e efeitos colaterais |
for | Controlar manualmente índices e fluxo | Não | Sim | Regras complexas e desempenho controlado |
for...of | Percorrer valores iteráveis | Não | Sim | Uso com break, continue e await |
map() | Transformar elementos | Sim | Não | Criação de uma coleção modificada |
filter() | Selecionar elementos por condição | Sim | Não | Remoção lógica de itens indesejados |
A principal diferença entre forEach() e map() é o retorno. Veja:
const valores = [1, 2, 3];
const dobrados = valores.map((valor) => valor * 2);
console.log(dobrados); // [2, 4, 6]
const tentativa = valores.forEach((valor) => valor * 2);
console.log(tentativa); // undefinedEmbora ambos executem um callback para cada elemento, map() constrói um novo array, enquanto forEach() descarta o valor retornado pelo callback. Usar forEach() para transformar dados exige criar e preencher manualmente uma variável externa, o que normalmente é menos expressivo.

Já a comparação com for...of ganha importância em rotinas assíncronas. O código abaixo não garante que as operações terminem em sequência:
itens.forEach(async (item) => {
await processarItem(item);
});Quando a ordem é importante, a alternativa mais segura é:
for (const item of itens) {
await processarItem(item);
}O guia oficial da MDN sobre loops e iteração ajuda a aprofundar a escolha entre as diferentes estruturas disponíveis na linguagem. Para especificações técnicas, também é útil consultar o padrão ECMAScript mantido pela TC39.
Dúvidas recorrentes sobre forEach JavaScript
O que é JavaScript forEach?
forEach() é um método de arrays que executa uma função uma vez para cada elemento da coleção. Ele é indicado para percorrer dados e realizar ações, como imprimir valores, atualizar a interface ou chamar outra função para cada registro.
O forEach retorna um array novo?
Não. O retorno de forEach() é undefined. Se for necessário gerar um novo array a partir dos valores existentes, o método mais apropriado costuma ser map(). Para selecionar apenas alguns elementos, use filter().
É possível usar break no forEach?
Não é possível usar break ou continue diretamente dentro do callback de forEach(). Se precisar encerrar a busca ao encontrar um resultado, considere for, for...of, some() ou find(), conforme o objetivo.
forEach funciona com objetos JavaScript?
Diretamente, não. O método pertence aos arrays. Para percorrer propriedades de um objeto, você pode converter suas chaves, valores ou pares em arrays com Object.keys(), Object.values() ou Object.entries() e, então, aplicar forEach().
Posso usar await dentro de forEach?
Você pode declarar o callback como assíncrono, mas forEach() não aguardará a conclusão das Promises. Isso pode causar execução paralela não controlada e erros difíceis de rastrear. Para operações assíncronas sequenciais, prefira for...of com await.
Conclusão: quando escolher o forEach
Dominar o JavaScript forEach é um passo importante para escrever código claro e consistente ao trabalhar com coleções. O método é excelente para percorrer arrays e executar ações em cada elemento, sobretudo em tarefas de apresentação de dados, atualização de interfaces, logs e chamadas de funções. No entanto, ele não substitui todas as estruturas de repetição: map() é superior para transformações, filter() para filtragem e for...of para fluxos que exigem interrupção ou espera assíncrona.
Ao escolher conscientemente o recurso adequado, você produz rotinas mais fáceis de testar, revisar e expandir. Em resumo, utilize forEach() quando a prioridade for realizar um efeito para cada item, sem precisar gerar um novo array nem interromper o processamento no meio do caminho.
Referências e materiais para estudo
- MDN Web Docs — Array.prototype.forEach().
- MDN Web Docs — Loops e iteração em JavaScript.
- ECMA-262 — Especificação oficial do ECMAScript.
- JavaScript.info — Métodos de arrays.
Isenção de responsabilidade
Este conteúdo possui finalidade exclusivamente educacional e informativa. Os exemplos de código foram elaborados para demonstrar conceitos de JavaScript e podem exigir adaptações conforme a versão do ambiente, o navegador, as bibliotecas utilizadas e os requisitos de cada projeto. Antes de aplicar qualquer solução em produção, realize testes, revise aspectos de segurança, desempenho e acessibilidade e consulte a documentação oficial atualizada das tecnologias envolvidas.
Compartilhar este post
Pesquisador, empresário e escritor focado em educação, orientação sobre negócios. Escreve sobre diversos assuntos com abordagem prática e acessível para o público brasileiro.