Pular para o conteúdo

A primeira escola especializada em tecnologia do Alto Solimões, com corpo técnico formado na área.

Módulo 2: Operadores e decisões

if, else e switch

Fazer o programa decidir

if e else

const idade = 15;

if (idade >= 18) {
console.log("Pode se matricular sozinho");
} else {
console.log("Precisa de responsável");
}

O else é opcional:

const vagas = 0;

if (vagas === 0) {
console.log("Turma lotada");
}

else if

const nota = 7.5;

if (nota >= 9) {
console.log("Excelente");
} else if (nota >= 7) {
console.log("Aprovado");
} else if (nota >= 5) {
console.log("Recuperação");
} else {
console.log("Reprovado");
}

A avaliação para na primeira condição verdadeira. Por isso a ordem importa: se nota >= 5 viesse primeiro, uma nota 9 cairia ali e nunca chegaria ao "Excelente".

Chaves, sempre

// Funciona, mas é frágil
if (vagas === 0) console.log("Lotada");

// Preferível
if (vagas === 0) {
console.log("Lotada");
}

Sem chaves, acrescentar uma segunda linha depois cria um defeito silencioso: ela fica fora do if e roda sempre.

Cláusula de guarda

Em vez de aninhar:

// Difícil de ler
function matricular(aluno) {
if (aluno) {
if (aluno.idade >= 14) {
if (aluno.documento) {
console.log("Matrícula feita");
}
}
}
}

// Plano: trata a exceção e sai
function matricular(aluno) {
if (!aluno) return;
if (aluno.idade < 14) return;
if (!aluno.documento) return;

console.log("Matrícula feita");
}

O caminho principal fica sem indentação, e cada motivo de recusa fica visível na própria linha.

switch

const turno = "manha";

switch (turno) {
case "manha":
console.log("8h às 11h");
break;
case "tarde":
console.log("14h às 17h");
break;
case "noite":
console.log("19h às 22h");
break;
default:
console.log("Turno não reconhecido");
}

O break é obrigatório na prática: sem ele, a execução cai no caso seguinte e continua. Esquecê-lo é um dos defeitos mais chatos de encontrar.

A queda proposital serve para agrupar:

switch (dia) {
case "sabado":
case "domingo":
console.log("Fim de semana");
break;
default:
console.log("Dia útil");
}

O switch compara com ===, então "1" não casa com case 1.

O objeto de consulta

Quando a decisão é só traduzir uma chave num valor, nem if nem switch são o melhor:

// Longo
function rotuloDoTurno(turno) {
if (turno === "manha") return "Manhã (8h às 11h)";
if (turno === "tarde") return "Tarde (14h às 17h)";
if (turno === "noite") return "Noite (19h às 22h)";
return "Turno não reconhecido";
}

// Direto
const ROTULOS_DO_TURNO = {
manha: "Manhã (8h às 11h)",
tarde: "Tarde (14h às 17h)",
noite: "Noite (19h às 22h)",
};

function rotuloDoTurno(turno) {
return ROTULOS_DO_TURNO[turno] ?? "Turno não reconhecido";
}

Acrescentar um turno vira uma linha no objeto. E o objeto pode até vir de fora, de um arquivo de configuração.

Um exemplo completo

const PRECO_POR_KG_EM_CENTAVOS = {
farinha: 1250,
acai: 2500,
tucuma: 800,
};

function calcularItem(produto, quilos) {
if (!produto) return 0;
if (quilos <= 0) return 0;

const preco = PRECO_POR_KG_EM_CENTAVOS[produto];
if (preco === undefined) return 0;

return Math.round(preco * quilos);
}

function faixaDeDesconto(totalEmCentavos) {
if (totalEmCentavos >= 10000) return 10;
if (totalEmCentavos >= 5000) return 5;
return 0;
}

const total = calcularItem("farinha", 3) + calcularItem("acai", 2);
const desconto = faixaDeDesconto(total);

console.log(`Total: R$ ${(total / 100).toFixed(2)}`);
console.log(`Desconto: ${desconto}%`);

Exercícios

  1. Escreva um if/else if que classifique a idade em criança, adolescente, adulto e idoso.
  2. Reescreva com cláusulas de guarda uma função com três if aninhados.
  3. Faça um switch para o dia da semana, agrupando sábado e domingo.
  4. Esqueça um break de propósito e observe o resultado.
  5. Troque uma cadeia de if que só traduz chaves por um objeto de consulta.
  6. Escreva a função de faixa de desconto: 5% acima de R$ 50, 10% acima de R$ 100.

Referências

Testa o que você leu

5 perguntas sobre esta aula. Errar aqui não custa nada - a explicação vem junto da correção.

Pergunta 1 de 5
O `else` é obrigatório depois de um `if`?