W3docs

Operadores Lógicos JavaScript (&&, ||, !)

Os operadores lógicos são essenciais para controlar o fluxo e a tomada de decisões em JavaScript. Este guia ajuda iniciantes a entender e usar eficazmente

Os operadores lógicos são fundamentais para controlar o fluxo e a tomada de decisões em JavaScript. Este guia explica como usar os operadores lógicos do JavaScript — &&, ||, !, o relacionado ?? e o idioma !! — e, igualmente importante, os dois comportamentos que confundem a maioria das pessoas: avaliação de curto-circuito e a semântica de retorno de valor. Todos os exemplos abaixo são executáveis.

Visão Geral dos Operadores Lógicos JavaScript

Os operadores lógicos avaliam um ou mais operandos e retornam um valor. Eles são uma parte central dos operadores do JavaScript e são usados com mais frequência dentro de condições, mas fazem muito mais do que produzir true/false:

  • && (AND Lógico)
  • || (OR Lógico)
  • ?? (Operador de Coalescência Nula — tecnicamente distinto, mas resolve o mesmo problema de "escolher um valor")
  • ! (NOT Lógico)
  • !! (NOT Duplo — o idioma de conversão para Boolean)

Valores truthy e falsy

Antes de entender os operadores, você precisa saber o que JavaScript trata como "verdadeiro" e "falso" em um contexto Boolean. Existem exatamente oito valores falsy; todo o resto é truthy.

javascript— editable

Isso importa porque &&, || e ! testam operandos pela truthiness, não estritamente pelo Boolean true. Veja Tipos de Dados JavaScript para os tipos de valores subjacentes.

Avaliação de curto-circuito e retorno de valor

Duas regras governam quase tudo que esses operadores fazem:

  1. Curto-circuito: a avaliação para assim que o resultado é conhecido. O operando do lado direito pode nunca ser executado.
  2. Eles retornam um operando, não um Boolean: && e || devolvem um dos valores originais, não true/false.
javascript— editable

É exatamente por isso que || funciona como seletor de valor padrão e por que && funciona como guarda, como mostrado adiante.

AND Lógico (&&)

Em um contexto Boolean, && é true somente quando ambos os operandos são truthy. Mais precisamente, ele retorna o primeiro operando falsy, ou o último operando se todos forem truthy. Use-o quando várias condições precisam ser satisfeitas, ou como uma guarda que executa o lado direito somente quando o lado esquerdo é truthy.

javascript— editable

Neste exemplo, tanto isLoggedin quanto hasPermissions precisam ser truthy para que o acesso seja concedido. Se algum deles for falsy, o acesso é negado — e por causa do curto-circuito, se isLoggedin for false, hasPermissions nunca é avaliado.

OR Lógico (||)

Em um contexto Boolean, || é true quando pelo menos um operando é truthy. Mais precisamente, ele retorna o primeiro operando truthy, ou o último operando se todos forem falsy. É isso que o torna um operador de fallback / valor padrão.

javascript— editable

Aqui, a operação pode continuar se networkStatus for 'good' ou se savedOffline for true, fornecendo um fallback quando o status da rede for fraco.

Operador de Coalescência Nula (??)

O operador ?? retorna seu lado direito somente quando o lado esquerdo é null ou undefined (coletivamente chamados de nullish). Ele ignora outros valores falsy como 0, '' e false. Essa diferença é o que o distingue do ||.

javascript— editable

Aqui itemCount é 0. Com ??, defaultCount permanece 0 porque 0 não é nullish — portanto, um zero legítimo é preservado.

?? vs ||

|| usa o fallback para qualquer valor falsy; ?? usa o fallback somente para null/undefined. Quando 0, '' ou false são entradas válidas, essa distinção é uma medida real de prevenção de bugs.

javascript— editable

Use ?? quando quiser um padrão apenas para "nenhum valor de fato", e mantenha || quando qualquer valor falsy deve acionar o fallback.

Aviso

Você não pode misturar ?? com && ou || sem parênteses — a || b ?? c é um SyntaxError. Escreva (a || b) ?? c para tornar o agrupamento explícito.

NOT Lógico (!)

O operador ! inverte a truthiness de seu operando e sempre retorna um Boolean. É útil para alternar estados ou verificar não-condições.

javascript— editable

Este exemplo verifica se isActive é false e, em caso afirmativo, indica que a ativação é necessária.

NOT Duplo (!!)

Aplicar ! duas vezes converte qualquer valor em seu equivalente Boolean: o primeiro ! inverte (e converte para Boolean), o segundo reverte. O resultado representa estritamente true ou false.

javascript— editable

!!0 resulta em false porque 0 é um valor falsy em JavaScript. O NOT duplo esclarece a conversão Boolean.

Usando !! para Verificar o Status Boolean de Propriedades de Objetos

Às vezes, você quer verificar se uma propriedade de um object não apenas existe, mas também é truthy. O operador !! é perfeito para converter qualquer valor em um contexto estritamente Boolean, deixando claro e explícito se a propriedade atende às condições.

Considere um cenário em que você tem um object de usuário que pode ter uma propriedade chamada isActive. Você quer executar uma ação somente se isActive não apenas estiver presente, mas for truthy.

javascript— editable

Neste exemplo:

  • O object de usuário tem uma propriedade isActive que é undefined.
  • Usar !!user.isActive converte undefined para false.
  • Como isActive é undefined (que é um valor falsy), !!undefined resulta em false, e a saída será "John is not active."

Cenários de Uso Prático

Renderização Condicional

javascript— editable

Este trecho demonstra o uso de && para renderização condicional, exibindo 'UserDashboard' somente quando isLoggedIn for true.

Gerenciando Padrões com OR Lógico

javascript— editable

Se currentUser for null, userName assume o padrão 'Guest'. Isso garante que uma saudação seja sempre personalizada.

Simplificando Condições Complexas

javascript— editable

Este código concede acesso total apenas a usuários verificados que são administradores ou editores, combinando && e ||. Os parênteses são importantes — veja a precedência de operadores abaixo.

Precedência de Operadores

Quando os operadores são combinados, o JavaScript os avalia em uma ordem fixa. Da maior para a menor precedência entre eles:

  1. ! (NOT Lógico) — maior
  2. && (AND Lógico)
  3. || (OR Lógico) e ?? (estes têm a mesma precedência, razão pela qual não podem ser misturados sem parênteses)

Os operadores de comparação (<, ===, etc.) têm maior precedência do que && e ||, portanto são avaliados primeiro. Veja Operadores de Comparação para mais detalhes.

javascript— editable

Na dúvida, adicione parênteses. Eles não têm custo e tornam a intenção inequívoca.

Boas Práticas

  • Evite a Complexidade: Mantenha as expressões lógicas simples. Se ficarem muito complexas, divida-as em partes menores e gerenciáveis.
  • Aproveite o Curto-Circuito: Utilize a natureza de curto-circuito de && e || para otimizar o desempenho, evitando avaliações desnecessárias.
  • Conversão Boolean Explícita: Use !! para converter valores claramente para true ou false, melhorando a legibilidade e previsibilidade do seu código.
  • Comparações Consistentes: Garanta tipos de dados consistentes nas comparações para evitar comportamentos inesperados causados pela coerção de tipos do JavaScript.

Conclusão

Os operadores lógicos são essenciais para escrever JavaScript eficaz. Lembre-se das duas ideias que explicam quase tudo o que eles fazem: avaliação de curto-circuito (o operando direito pode nunca ser executado) e retorno de valor (&& e || retornam um dos operandos, não um Boolean). Use ?? em vez de || sempre que 0, '' ou false forem valores válidos, e adicione parênteses sempre que a precedência não for clara.

Para aprofundar, veja o Operador Condicional (Ternário) para escolher entre dois valores inline, e Operadores de Comparação para construir as condições que alimentam as expressões lógicas.

Prática

Prática
Qual é o comportamento dos operadores lógicos em JavaScript?
Qual é o comportamento dos operadores lógicos em JavaScript?
Was this page helpful?