Operadores e expressões: a ordem em que a conta acontece
Aritméticos, relacionais e a precedência que muda o resultado: a mesma expressão avaliada no papel em subexpressões numeradas e depois no Node.
Expressão é uma parte do algoritmo que pode ser reduzida a um valor. Operadores dizem como combinar os valores; precedência decide qual combinação acontece primeiro. Prever essa ordem no papel evita corrigir a conta por tentativa.
Vamos calcular o preço final de um pedido de material escolar. Antes de usar símbolos, confirme os tipos na lição de variável e tipo de dado: preço e quantidade são números, enquanto comparações produzem booleanos.
Tudo que se reduz a um valor é expressão
Um número isolado, uma soma e uma comparação são expressões. A atribuição guarda o valor obtido:
const subtotal = 40 * 5;
const temFreteGratis = subtotal >= 200;
console.log(subtotal);
console.log(temFreteGratis);
console.log(typeof temFreteGratis);Pense numa bancada: cada operação pega valores, trabalha e deixa um valor no lugar. A analogia termina quando há efeitos colaterais; uma chamada de função também pode alterar estado além de produzir resultado. Nesta lição, mantemos expressões puras para enxergar a regra.
Os aritméticos e as perguntas que cada um responde
Soma, subtração, multiplicação e divisão resolvem contas conhecidas. Resto (%) responde o que sobra depois de formar grupos inteiros, e exponenciação (**) repete multiplicação:
console.log('soma', 17 + 5);
console.log('subtração', 17 - 5);
console.log('multiplicação', 17 * 5);
console.log('divisão', 17 / 5);
console.log('resto', 17 % 5);
console.log('potência', 2 ** 5);JavaScript não possui um operador separado de divisão inteira para number. Quando o requisito pede somente caixas completas, você combina divisão com Math.floor.
const lapis = 17;
const porCaixa = 5;
console.log('caixas completas', Math.floor(lapis / porCaixa));
console.log('lápis soltos', lapis % porCaixa);O quociente e o resto contam a mesma história. Se caixas * porCaixa + soltos não reconstruir o total, sua decomposição está errada.
Resto decide paridade e ciclos
Par ou ímpar é o primeiro uso conhecido: números pares deixam resto zero ao dividir por dois. O mesmo operador distribui posições num ciclo de três equipes:
for (let numero = 1; numero <= 6; numero += 1) {
const paridade = numero % 2 === 0 ? 'par' : 'ímpar';
const equipe = ['azul', 'verde', 'roxa'][(numero - 1) % 3];
console.log(numero, paridade, equipe);
}O resto cria repetição sem copiar uma tabela infinita. Em datas e paginação, declare de onde o ciclo começa; deslocar por um muda todas as posições.
Comparação devolve verdadeiro ou falso
Os relacionais não calculam distância; respondem a uma pergunta. Valores de borda merecem atenção:
const idade = 18;
console.log('maior que 18', idade > 18);
console.log('maior ou igual a 18', idade >= 18);
console.log('igual a 18', idade === 18);
console.log('diferente de 18', idade !== 18);Trocar > por >= muda a regra exatamente no limite. Por isso testes incluem um valor abaixo, o próprio limite e um acima. A estrutura condicional usará esse booleano para escolher um caminho.
Precedência: multiplicação acontece antes da soma
Sem parênteses, *, / e % são avaliados antes de + e -:
console.log(2 + 3 * 4);
console.log((2 + 3) * 4);O primeiro caso vira 2 + 12; o segundo obriga 5 * 4. Não decore uma tabela inteira. Em regra de negócio, use parênteses para registrar a intenção e avalie de dentro para fora.
A expressão do pedido em cinco subexpressões
Considere preco * quantidade - desconto / 2 + frete, com preço 40, quantidade 5, desconto 30 e frete 4,40. O rastreio manual produz os valores que o Node confirma:
const preco = 40;
const quantidade = 5;
const desconto = 30;
const frete = 4.4;
const passo1 = preco * quantidade;
const passo2 = desconto / 2;
const passo3 = passo1 - passo2;
const passo4 = passo3 + frete;
console.log({ passo1, passo2, passo3, passo4 });O quinto passo do papel é associar passo4 ao preço final. A tabela não “simula JavaScript por intuição”; ela segue a precedência definida pela linguagem.
Parênteses registram a regra do desconto
Se o requisito diz “somar o frete e então aplicar metade do desconto ao pedido inteiro”, a expressão precisa mudar. Compare duas intenções:
const subtotal = 200;
const desconto = 30;
const frete = 20;
const descontoSoNosProdutos = subtotal - desconto / 2 + frete;
const descontoNoPedidoInteiro = (subtotal + frete) - desconto / 2;
console.log(descontoSoNosProdutos);
console.log(descontoNoPedidoInteiro);As duas deram o mesmo valor porque subtrair um desconto fixo comutou com a soma do frete. Esse resultado é um alerta didático: uma entrada só não distingue algoritmos diferentes. Troque desconto fixo por percentual para revelar a regra:
const subtotal = 200;
const frete = 20;
const percentual = 0.1;
console.log(subtotal * (1 - percentual) + frete);
console.log((subtotal + frete) * (1 - percentual));Agora o teste separa os caminhos. O primeiro preserva o frete; o segundo concede desconto sobre ele.
O erro de comparar texto com número
Igualdade solta converte antes de comparar e pode esconder a entrada errada:
const quantidadeDigitada = '2';
console.log(quantidadeDigitada == 2);
console.log(quantidadeDigitada === 2);
console.log(Number(quantidadeDigitada) === 2);A primeira linha parece conveniente, mas transfere a decisão de conversão para uma regra ampla da linguagem. A terceira torna a intenção explícita: converter na entrada, depois comparar tipo e valor.
Antes de encerrar, revise expressões com um teste de propriedade. O preço final não deveria diminuir quando a quantidade aumenta, a menos que uma faixa de desconto explique a mudança. O total não deveria ficar negativo quando o desconto é limitado ao subtotal. Essas afirmações capturam regras maiores que um único exemplo.
Separe também cálculo e formatação. Arredondar cada parcela pode produzir resultado diferente de somar em centavos e formatar no fim. Escolha uma política, registre a unidade e use o mesmo caminho em todos os casos. Precedência correta não compensa unidade inconsistente.
Quando uma expressão passa de uma linha legível, nomeie subexpressões pelo papel: subtotal, descontoAplicado, valorComFrete. O Node calcula igual, mas o teste de mesa passa a comparar estados com significado. Nomes intermediários são parte da prova, não desperdício de linhas.
Sua missão é escrever no papel a expressão de um pedido com subtotal, cupom percentual, taxa fixa e frete grátis acima de R$ 200. Teste 199,99, 200 e 200,01. Depois use a tabela verdade para combinar cupom e elegibilidade, confira o percurso no guia de lógica e mantenha a trilha de Lógica como índice.
Perguntas frequentes
Parênteses demais deixam a expressão errada?
Por que JavaScript tem igualdade estrita e solta?
Dúvidas e comentários
Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.
Entrar para perguntarÉ o mesmo login gratuito dos cursos.
Nenhuma dúvida por aqui ainda — a primeira pode ser a sua.
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
- ECMAScript — Multiplicative Operators — tc39.es
- ECMAScript — Equality Operators — tc39.es


