Operador ternário e atribuições condicionais
Esta aula aborda o operador ternário em JavaScript, sua sintaxe, quando utilizá-lo e os riscos do aninhamento. Inclui exemplos práticos, boas práticas e exercícios com respostas.
O operador ternário é uma forma concisa de escrever uma estrutura condicional if...else em JavaScript. Ele é frequentemente usado para atribuições condicionais, permitindo que você atribua um valor a uma variável com base em uma condição em uma única linha.
Embora pareça simples, é importante entender quando e como usá-lo para manter o código legível e evitar armadilhas como o aninhamento excessivo.
Sintaxe
A sintaxe do operador ternário é:
condicao ? valorSeVerdadeiro : valorSeFalsoO operador avalia a condicao (que deve ser um valor booleano ou coercível para booleano). Se for verdadeira, retorna valorSeVerdadeiro; caso contrário, retorna valorSeFalso.
Exemplo básico:
let idade = 20;
let podeVotar = idade >= 18 ? 'Sim' : 'Não';
console.log(podeVotar); // 'Sim'Neste exemplo, a condição idade >= 18 é verdadeira, então a variável podeVotar recebe o valor 'Sim'.
Quando usar
O operador ternário é ideal para atribuições simples e rápidas onde a condição é clara e o resultado é curto. Ele reduz a verbosidade do código em comparação com um bloco if...else.
Exemplo de uso apropriado:
let mensagem = usuarioLogado ? 'Bem-vindo!' : 'Faça login.';
console.log(mensagem);Outro caso comum é em retornos de funções:
function getStatus(ativo) {
return ativo ? 'Ativo' : 'Inativo';
}
console.log(getStatus(true)); // 'Ativo'Evite usar o operador ternário quando a lógica se torna complexa ou quando o efeito colateral (como chamar funções) é significativo. Prefira if...else para múltiplas condições ou blocos de código maiores.
Aninhamento (e por que evitar)
Embora seja possível aninhar operadores ternários, isso geralmente prejudica a legibilidade e é considerado uma má prática. Exemplo de aninhamento:
let tipo = nota >= 90 ? 'A' : nota >= 80 ? 'B' : nota >= 70 ? 'C' : 'D';
console.log(tipo);Este código é difícil de ler e entender rapidamente. Em vez disso, prefira usar if...else ou uma estrutura switch para múltiplas condições:
let tipo;
if (nota >= 90) {
tipo = 'A';
} else if (nota >= 80) {
tipo = 'B';
} else if (nota >= 70) {
tipo = 'C';
} else {
tipo = 'D';
}
console.log(tipo);O aninhamento também pode ser usado com cuidado em casos muito simples, mas geralmente é melhor evitar. Se precisar de uma expressão ternária para múltiplas condições, considere usar uma função ou um objeto de mapeamento.
Boas práticas
- Use o operador ternário apenas para atribuições ou retornos simples.
- Evite aninhamentos; prefira estruturas condicionais mais claras.
- Não use ternário para executar funções com efeitos colaterais; isso pode tornar o código confuso.
- Mantenha a condição e os valores curtos para que caibam em uma linha.
Referências
- MDN: Operador Condicional Ternário
- W3Schools: JavaScript Comparisons
- JavaScript.info: Ternary Operator
- freeCodeCamp: JavaScript Ternary Operator
- DigitalOcean: Using the Ternary Operator in JavaScript
Exercícios
- Traduza o seguinte código usando o operador ternário:
let resultado; if (x > 0) { resultado = 'positivo'; } else { resultado = 'negativo ou zero'; }✓ Resposta:let resultado = x > 0 ? 'positivo' : 'negativo ou zero'; - Escreva uma função que recebe um número e retorna 'par' se for par, 'ímpar' caso contrário, usando o operador ternário.✓ Resposta:
function parOuImpar(num) { return num % 2 === 0 ? 'par' : 'ímpar'; } - O que está errado no seguinte uso do operador ternário? Como corrigir?
let cor = 'azul'; let mensagem = cor === 'azul' ? 'O céu é azul' : cor === 'vermelho' ? 'O fogo é vermelho' : 'Cor desconhecida';✓ Resposta: O código aninha ternários, dificultando a leitura. Uma correção seria usarif...elseouswitch. Exemplo comif...else:let cor = 'azul'; let mensagem; if (cor === 'azul') { mensagem = 'O céu é azul'; } else if (cor === 'vermelho') { mensagem = 'O fogo é vermelho'; } else { mensagem = 'Cor desconhecida'; } - Use o operador ternário para atribuir a uma variável
acessoo valor 'permitido' seidade >= 18eautorizacao === true, caso contrário 'negado'.✓ Resposta:let acesso = (idade >= 18 && autorizacao) ? 'permitido' : 'negado'; - Reescreva a seguinte função sem usar o operador ternário, usando
if...else:function saudacao(hora) { return hora < 12 ? 'Bom dia' : hora < 18 ? 'Boa tarde' : 'Boa noite'; }✓ Resposta:function saudacao(hora) { if (hora < 12) { return 'Bom dia'; } else if (hora < 18) { return 'Boa tarde'; } else { return 'Boa noite'; } }