Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIniciantecódigo testado

Laço de repetição e contador: repetir sem copiar código

Enquanto, para e a variável contadora: as três perguntas de todo laço, quantas voltas ele dá de verdade e por que o laço infinito acontece.

Rodolfo Mori4 min de leitura

Laço de repetição executa o mesmo trecho enquanto uma condição permite; contador registra quantas voltas ocorreram ou qual posição está sendo processada. Todo laço precisa deixar claro onde começa, até quando continua e como se aproxima do fim.

O domínio é a separação de dez pedidos de uma papelaria. Copiar dez chamadas cria dez lugares para errar. Um laço mantém uma regra e muda somente o estado necessário.

O trecho que se repete e a condição que manda parar

O menor while começa em um, verifica o limite e incrementa:

js
let pedido = 1;

while (pedido <= 3) {
  console.log(`separando pedido ${pedido}`);
  pedido += 1;
}
separando pedido 1 separando pedido 2 separando pedido 3

Pense num funcionário que olha a fila antes de pegar o próximo pedido. A analogia termina porque um laço pode processar dados sem ordem física e pode alterar mais de um estado. O ponto útil é: a pergunta ocorre antes de cada volta.

As três perguntas de todo laço

Registre início, condição e passo como dados antes de escrever a sintaxe:

js
const plano = {
  inicio: 1,
  condicao: 'pedido <= 10',
  passo: 'pedido += 1',
};

console.log(Object.values(plano).join(' | '));
1 | pedido <= 10 | pedido += 1

O início define o primeiro estado; a condição decide se o corpo executa; o passo deve aproximar a condição de falso. Se uma dessas respostas faltar, pare antes de rodar.

Enquanto e para escrevem a mesma contagem

Quando as três partes cabem numa linha, for reúne a estrutura:

js
const comWhile = [];
let i = 1;
while (i <= 3) {
  comWhile.push(i);
  i += 1;
}

const comFor = [];
for (let j = 1; j <= 3; j += 1) comFor.push(j);

console.log(comWhile);
console.log(comFor);
[ 1, 2, 3 ] [ 1, 2, 3 ]

Não existe vencedor universal. Escolha a forma que torna visível a condição de parada. Converter um no outro é um bom teste de entendimento.

Contador é estado, não decoração

O contador pode representar volta e posição. Imprima valor, resultado da condição e total executado:

js
let voltas = 0;
for (let i = 0; i <= 10; i += 1) {
  voltas += 1;
  console.log(`i=${i} condição=${i <= 10} voltas=${voltas}`);
}
console.log(`total=${voltas}`);
i=0 condição=true voltas=1 i=1 condição=true voltas=2 i=2 condição=true voltas=3 i=3 condição=true voltas=4 i=4 condição=true voltas=5 i=5 condição=true voltas=6 i=6 condição=true voltas=7 i=7 condição=true voltas=8 i=8 condição=true voltas=9 i=9 condição=true voltas=10 i=10 condição=true voltas=11 total=11

Começar em zero e incluir dez gera onze valores. A tabela de rastreio conta estados, não a distância entre extremos.

O erro de um a mais

Se o requisito diz “dez voltas a partir de zero”, o último índice é nove:

js
let voltas = 0;
for (let i = 0; i < 10; i += 1) voltas += 1;

console.log(voltas);
10

Trocar &lt;= por &lt; corrige este caso porque o limite representa quantidade, não valor final incluído. Em intervalos reais, escreva exemplos das duas bordas antes de escolher o operador.

O laço infinito e a mudança esquecida

Um while (i &lt;= 3) sem incremento nunca muda a pergunta. Para reproduzir o defeito sem travar a máquina, adicionamos um fusível de diagnóstico:

js
let i = 1;
let voltas = 0;

while (i <= 3) {
  voltas += 1;
  if (voltas === 1_000_000) break;
}

console.log({ i, voltas, condicaoAindaVerdadeira: i <= 3 });
{ i: 1, voltas: 1000000, condicaoAindaVerdadeira: true }

O milhão de voltas foi executado no Node, mas o fusível pertence ao diagnóstico, não à solução. A correção é alterar i no corpo ou redesenhar a condição.

Parar no meio quando a resposta já apareceu

Numa busca, continuar depois de encontrar desperdiça trabalho. break encerra o laço:

js
const pedidos = ['P10', 'P11', 'P12', 'P13'];
let comparacoes = 0;

for (const pedido of pedidos) {
  comparacoes += 1;
  if (pedido === 'P12') break;
}

console.log(comparacoes);
3

O critério é objetivo: depois de encontrar P12, nenhum elemento seguinte pode mudar a resposta. A complexidade de algoritmo transforma essa economia em contagem de passos.

Tabuada e contagem regressiva

Uma tabuada usa contador crescente; um lançamento usa contador decrescente. A regra é a mesma, mas o passo muda de sinal:

js
for (let i = 1; i <= 3; i += 1) console.log(`7 x ${i} = ${7 * i}`);
for (let segundos = 3; segundos >= 1; segundos -= 1) console.log(segundos);
console.log('lançar');
7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 3 2 1 lançar

Missão: preveja antes de executar

Escreva a tabuada completa do 7 e uma contagem de 10 a 0. Antes de rodar, anote primeiro valor, último valor e total de voltas. Depois faça o programa conferir sua previsão:

js
const resultados = [];
for (let i = 1; i <= 10; i += 1) resultados.push(7 * i);

console.log({ primeiro: resultados[0], ultimo: resultados.at(-1), voltas: resultados.length });
{ primeiro: 7, ultimo: 70, voltas: 10 }

Revise o laço separando avaliação e execução. A condição é consultada uma vez a mais que o corpo no término normal: a última consulta retorna falso. Essa diferença explica por que logs colocados apenas no corpo não mostram o estado que encerrou a repetição.

Também registre a variante do laço. Se percorre uma coleção que pode mudar durante a execução, adicionar ou remover itens altera quantidade e índices. Prefira produzir uma nova coleção ou documentar cuidadosamente a mutação. Um laço correto para dados estáveis pode falhar quando o próprio corpo modifica o limite.

Em processamento grande, não use break para esconder várias condições de saída espalhadas. Uma interrupção por resposta encontrada é clara; cinco interrupções por estados desconexos pedem função menor ou condição redesenhada. O teste precisa cobrir término normal e cada interrupção antecipada.

Por fim, compare quantidade prevista e observada com entradas zero, um e muitas. Esses três tamanhos expõem inicialização, primeira volta e crescimento. Se uma lista vazia ainda executa o corpo, a condição de entrada está errada.

Anote o custo por volta. Um laço com consulta remota ou busca completa dentro do corpo pode crescer muito mais que o contador sugere. Primeiro prove a correção do fluxo; depois conte o trabalho interno e escolha se dados podem ser preparados uma vez antes da repetição.

Termine quando previsão e saída coincidirem. Em seguida, use um acumulador para calcular média, percorra vetores e matrizes, revise combinações na tabela verdade e mantenha o guia de lógica como mapa.

  • laco de repeticao
  • contador
  • enquanto
  • para
  • laco infinito

Perguntas frequentes

Quando usar for em vez de while?
Prefira for quando início, condição e passo formam uma contagem clara. While comunica melhor uma repetição cujo fim depende de estado, entrada ou evento.
Break é sempre sinal de laço mal escrito?
Não. Ele é adequado quando encontrar a resposta encerra a busca. Fica suspeito quando substitui uma condição de parada que deveria estar declarada no próprio laço.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em Node v26.3.0, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. ECMAScript — The while Statement — tc39.es
  2. ECMAScript — The for Statement — tc39.es

Continue por aqui