Laços de Repetição: for, while e do...while
Imagine que você precisa exibir os números de 1 a 100. Você escreveria cem linhas de console.log? Claro que não. É exatamente para isso que existem os laços de repetição — eles permitem que um bloco de código seja executado várias vezes, de forma controlada e elegante.
Este é um dos conceitos mais fundamentais de qualquer linguagem de programação. Dominar os laços é o que começa a separar quem escreve código de quem resolve problemas com código.
O laço for
O for é o laço mais usado quando você sabe quantas vezes quer repetir algo.
for (let i = 1; i <= 5; i++) {
console.log(`Repetição número ${i}`);
}
// Repetição número 1
// Repetição número 2
// Repetição número 3
// Repetição número 4
// Repetição número 5
O for tem três partes separadas por ponto e vírgula:
for (inicialização ; condição ; incremento) {
// código executado a cada volta
}
- Inicialização:
let i = 1— define o ponto de partida - Condição:
i <= 5— enquanto for verdadeira, o laço continua - Incremento:
i++— executado ao final de cada volta (equivale ai = i + 1)
Contando de forma diferente
O for é flexível. Você pode contar de qualquer jeito:
// Contando de 2 em 2
for (let i = 0; i <= 10; i += 2) {
console.log(i); // 0, 2, 4, 6, 8, 10
}
// Contando de trás para frente
for (let i = 5; i >= 1; i--) {
console.log(i); // 5, 4, 3, 2, 1
}
// Tabuada do 7
for (let i = 1; i <= 10; i++) {
console.log(`7 x ${i} = ${7 * i}`);
}
Percorrendo arrays com for
Uma das aplicações mais comuns do for é percorrer listas de dados:
const frutas = ["maçã", "banana", "laranja", "uva"];
for (let i = 0; i < frutas.length; i++) {
console.log(`Fruta ${i + 1}: ${frutas[i]}`);
}
// Fruta 1: maçã
// Fruta 2: banana
// Fruta 3: laranja
// Fruta 4: uva
frutas.length retorna o tamanho do array — neste caso, 4. Por isso a condição é i < 4 (os índices vão de 0 a 3).
for...of — a forma moderna de percorrer listas
Quando você não precisa do índice, o for...of é mais limpo e legível:
const frutas = ["maçã", "banana", "laranja", "uva"];
for (const fruta of frutas) {
console.log(fruta);
}
// maçã
// banana
// laranja
// uva
Prefira o for...of sempre que só precisar dos valores. Guarde o for clássico para quando precisar controlar o índice.
O laço while
O while é usado quando você não sabe exatamente quantas vezes vai repetir — você repete enquanto uma condição for verdadeira.
let tentativas = 0;
const maxTentativas = 3;
while (tentativas < maxTentativas) {
console.log(`Tentativa ${tentativas + 1} de ${maxTentativas}`);
tentativas++;
}
// Tentativa 1 de 3
// Tentativa 2 de 3
// Tentativa 3 de 3
Cuidado com o loop infinito! Se a condição nunca se tornar false, o programa trava. Sempre garanta que algo dentro do laço vai eventualmente tornar a condição falsa.
// ⚠️ NUNCA faça isso — loop infinito:
while (true) {
console.log("Isso nunca para...");
}
Exemplo real com while — tentativas de senha
const senhaCorreta = "js2025";
let tentativa = "";
let tentativas = 0;
// Simulando tentativas
const senhasDigitadas = ["abc", "1234", "js2025", "outra"];
while (tentativa !== senhaCorreta && tentativas < senhasDigitadas.length) {
tentativa = senhasDigitadas[tentativas];
tentativas++;
if (tentativa === senhaCorreta) {
console.log(`Acesso liberado na tentativa ${tentativas}!`);
} else {
console.log(`Senha incorreta: "${tentativa}"`);
}
}
// Senha incorreta: "abc"
// Senha incorreta: "1234"
// Acesso liberado na tentativa 3!
O laço do...while
Parecido com o while, mas com uma diferença crucial: o bloco de código sempre executa pelo menos uma vez, mesmo que a condição seja falsa desde o início.
let numero = 10;
do {
console.log(`O número é ${numero}`);
numero++;
} while (numero < 5);
// O número é 10
// (executa uma vez mesmo com número >= 5)
Isso é útil, por exemplo, quando você precisa exibir um menu e pedir uma escolha antes de verificar se ela é válida:
let opcao;
// Simulando: usuário digitou opções até escolher uma válida
const entradas = [9, 0, 2];
let i = 0;
do {
opcao = entradas[i];
console.log(`Opção digitada: ${opcao}`);
i++;
} while (opcao < 1 || opcao > 3);
// Opção digitada: 9
// Opção digitada: 0
// Opção digitada: 2 ← válida, para aqui
break e continue — controlando o laço
break interrompe o laço imediatamente:
for (let i = 1; i <= 10; i++) {
if (i === 5) {
console.log("Encontrei o 5! Parando.");
break;
}
console.log(i);
}
// 1
// 2
// 3
// 4
// Encontrei o 5! Parando.
continue pula a iteração atual e vai para a próxima:
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) continue; // pula os pares
console.log(i);
}
// 1, 3, 5, 7, 9
Laços aninhados
Um laço dentro de outro. Útil para trabalhar com matrizes ou combinações:
// Tabuada completa de 1 a 3
for (let i = 1; i <= 3; i++) {
for (let j = 1; j <= 3; j++) {
console.log(`${i} x ${j} = ${i * j}`);
}
}
// 1 x 1 = 1
// 1 x 2 = 2
// 1 x 3 = 3
// 2 x 1 = 2
// ...e assim por diante
Use laços aninhados com moderação — eles crescem em complexidade rapidamente.
Comparativo rápido
| Laço | Use quando |
|---|---|
for |
Sabe o número exato de repetições |
for...of |
Quer percorrer os valores de um array |
while |
Repete enquanto uma condição for verdadeira |
do...while |
Precisa executar ao menos uma vez antes de verificar |
Tarefa para você
Tente resolver estes desafios no console do navegador:
Desafio 1: Exiba todos os números de 1 a 20 que sejam divisíveis por 3.
Desafio 2: Some todos os números de 1 a 100 e exiba o resultado.
// Dica para o desafio 2:
let soma = 0;
// seu laço aqui...
console.log(`A soma é: ${soma}`); // deve ser 5050
Desafio 3: Percorra o array abaixo e exiba apenas os nomes com mais de 4 letras.
const nomes = ["Ana", "Carlos", "Li", "Fernanda", "Bob", "Mariana"];
Conclusão
Neste artigo você aprendeu:
- O laço
fore suas variações - O
for...ofpara percorrer arrays com elegância - O
whilepara repetições baseadas em condições - O
do...whilepara garantir ao menos uma execução - Como usar
breakecontinuepara controlar o fluxo - Laços aninhados e quando usá-los
No próximo artigo chegaremos em um dos tópicos mais importantes do JavaScript: as funções. É onde o código começa a se organizar de verdade.
📚 Fontes e Referências
- MDN Web Docs — for: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/for
- MDN Web Docs — while: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/while
- MDN Web Docs — do...while: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/do...while
- MDN Web Docs — for...of: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/for...of
- JavaScript.info — Loops: https://javascript.info/while-for
- Eloquent JavaScript, Cap. 2 — Marijn Haverbeke: https://eloquentjavascript.net/02_program_structure.html
- You Don't Know JS: Scope & Closures — Kyle Simpson: https://github.com/getify/You-Dont-Know-JS