W3docs

Operadores de Comparação do JavaScript

Aprenda os operadores de comparação do JavaScript, incluindo igualdade estrita, coerção de tipos e casos especiais com null, NaN e Object.is.

Os operadores de comparação em JavaScript são essenciais para tomar decisões no seu código ao comparar valores. Este guia aprofunda os operadores de comparação do JavaScript, enriquecido com exemplos práticos, explicações claras e um foco especial em alguns comportamentos incomuns que podem ocorrer ao comparar certos tipos de dados.

Esta página aborda os operadores relacionais (<, >, <=, >=), a diferença entre igualdade fraca (==) e estrita (===), como a coerção de tipos altera o resultado e os casos extremos com null, undefined, NaN e Object.is. Para a lista completa de operadores JavaScript, consulte Operadores JavaScript; para combinar comparações, veja Operadores Lógicos.

Introdução aos Operadores de Comparação

Os operadores de comparação comparam dois valores e retornam um valor Boolean (true ou false) com base em se a comparação é verdadeira. Existem vários operadores de comparação principais em JavaScript:

  • == (Igualdade fraca)
  • === (Igualdade estrita)
  • != (Desigualdade fraca)
  • !== (Desigualdade estrita)
  • > (Maior que)
  • < (Menor que)
  • >= (Maior ou igual a)
  • <= (Menor ou igual a)

Cada operador tem uma função específica, e compreender as diferenças entre eles é fundamental para uma programação precisa.

Comparação Fraca vs. Estrita

A maior decisão ao comparar valores é se você permite que o JavaScript converta os tipos por você. A igualdade fraca (==) converte os operandos para um tipo comum antes; a igualdade estrita (===) não faz isso.

Igualdade Fraca (==)

javascript— editable

Explicação: Aqui, 1 e "1" parecem diferentes (um é um número e o outro é uma string), mas == converte ambos para o mesmo tipo antes de compará-los. É por isso que são considerados iguais. Consulte conversão de tipos para as regras exatas.

Igualdade Estrita (===)

javascript— editable

Explicação: Desta vez, 1 e "1" não são considerados iguais porque === verifica se o valor e o tipo são exatamente os mesmos. Aqui, eles não são do mesmo tipo.

Operadores de Desigualdade

Desigualdade Fraca (!=)

javascript— editable

Explicação: 1 e "2" são diferentes. != também converte tipos para comparar, mas como os valores são diferentes após a conversão de tipo, retorna true.

Desigualdade Estrita (!==)

javascript— editable

Explicação: Aqui, !== considera os valores diferentes porque verifica sem converter o tipo. Como os tipos (number vs. string) são diferentes, retorna true.

Operadores Relacionais

javascript— editable

Explicação: Estes exemplos mostram comparações básicas:

  • x < y é true porque 5 é menor que 10.
  • x > y é false porque 5 não é maior que 10.
  • x <= 5 é true porque 5 é igual a 5.
  • y >= 11 é false porque 10 não é maior ou igual a 11.

Nota sobre comparação de strings: Quando < e > são usados com strings, o JavaScript as compara lexicograficamente (pelo valor Unicode). Por exemplo, 'b' > 'a' é true, mas '10' < '2' também é true porque a comparação ocorre caractere por caractere.

Aplicações Práticas dos Operadores de Comparação

Funções de Ordenação

javascript— editable

Explicação: Este código ordena números em ordem crescente. A função sort compara cada par de números, organizando-os do menor para o maior.

Lógica Condicional

javascript— editable

Explicação: Este código verifica se age é 18 ou mais. Se sim, imprime "You are an adult." Se não, imprime "You are not an adult."

Comportamentos Estranhos do JavaScript

O JavaScript às vezes exibe comportamentos estranhos ao comparar tipos de dados incomuns:

javascript— editable

Explicação:

  • [] == 0: Um array vazio é considerado igual a zero porque quando o array é convertido para número, torna-se 0.
  • [] == ![]: Isso parece muito estranho, mas veja o que acontece: ![] converte o array para boolean (que é true porque arrays são truthy), depois nega para false. Ao comparar [] com false, ambos são convertidos para números (0 e 0), portanto são "iguais."

Vamos explorar mais exemplos do comportamento incomum do JavaScript em comparações e outras operações.

Comparando Arrays e Objects

As verificações de igualdade fraca do JavaScript podem produzir resultados inesperados ao comparar arrays e objects devido à forma como essas estruturas de dados são convertidas e comparadas.

javascript— editable

Explicação:

  • [] == [] e {} == {}: Embora ambos os lados da comparação pareçam idênticos, são instâncias diferentes na memória. O JavaScript verifica a igualdade de object e array com base no endereço de memória, não no conteúdo.
  • [] == ![]: Este caso segue as mesmas regras de coerção explicadas na seção anterior.

Null vs. Undefined

A comparação entre null e undefined com igualdade fraca também mostra comportamento incomum, mas eles compartilham algumas semelhanças em JavaScript.

javascript— editable

Explicação:

  • null == undefined: O JavaScript trata null e undefined como fracamente iguais, o que é uma exceção nas regras de igualdade fraca.
  • null === undefined: Como são tipos diferentes, a igualdade estrita retorna false.
  • null == 0, null > 0 e null >= 0: Em comparações relacionais, null converte para 0, então null >= 0 torna-se 0 >= 0, o que resulta em true. No entanto, null == 0 e null > 0 permanecem false porque null só converte para 0 em contextos relacionais, não em igualdade fraca.

Comparações de Boolean e Não-Boolean

Comparar booleans com não-booleans usando igualdade fraca pode levar a resultados contraintuitivos devido à coerção de tipos para números.

javascript— editable

Explicação:

  • true == 1 e false == 0: Em JavaScript, true converte para 1 e false para 0, por isso essas comparações retornam true.
  • true == 2: Como true converte para 1, não é igual a 2.
  • true == "1" e false == "0": As strings são convertidas para números, correspondendo aos números para os quais true e false convertem.

Comparando NaN

NaN ("Not a Number") é o único valor em JavaScript que não é igual a si mesmo. Toda comparação com NaN, incluindo NaN === NaN, retorna false. Use Number.isNaN() (ou Object.is) para testá-lo.

javascript— editable

Explicação: Como NaN é diferente de tudo (inclusive de si mesmo), não é possível detectá-lo com == ou ===. Number.isNaN() é a verificação confiável.

Usando Object.is para Comparações

Para quem precisa de comparações precisas, especialmente com casos extremos como NaN e +0 vs. -0, o JavaScript fornece Object.is.

javascript— editable

Explicação:

  • Object.is(NaN, NaN): Ao contrário dos operadores de igualdade, Object.is identifica corretamente dois valores NaN como iguais.
  • Object.is(+0, -0): Object.is distingue entre zero positivo e negativo, o que os operadores de igualdade não fazem.
  • Object.is(false, false): Demonstra igualdade exata sem coerção, retornando true para valores primitivos idênticos.

Compreender esses comportamentos estranhos do JavaScript não apenas ajuda a evitar armadilhas potenciais, mas também aprimora a capacidade de depurar problemas complexos de forma eficaz.

Esses exemplos ilustram por que é geralmente mais seguro usar operadores de comparação estrita (=== e !==) que não convertem tipos automaticamente. Isso ajuda a evitar resultados inesperados no seu código JavaScript.

Aviso

Use operadores de comparação estrita (=== e !==) em JavaScript para garantir precisão de tipo e valor. Isso evita a coerção de tipos não intencional, tornando suas comparações mais previsíveis e confiáveis. Por exemplo, 0 === '0' retorna false, destacando a importância de fazer os tipos coincidirem.

Resumo de Armadilhas

Tenha em mente esses resultados surpreendentes. A maioria deles desaparece se você usar === e !==:

ExpressãoResultadoPor quê
0 == ''trueAmbos convertem para o número 0
0 == '0'trueA string '0' converte para 0
'' == '0'falseDuas strings não-vazias/vazias, sem coerção numérica
null == undefinedtrueRegra especial na igualdade fraca
null >= 0trueOperadores relacionais convertem null para 0
null == 0falseA igualdade fraca não converte null para 0
NaN === NaNfalseNaN nunca é igual a nada
[] == ![]true![] é false, depois ambos convertem para 0
Object.is(NaN, NaN)trueObject.is trata NaN como igual a si mesmo
Object.is(+0, -0)falseObject.is distingue zeros com sinal

Uma regra prática: ==/=== e !=/!== comparam (des)igualdade, enquanto <, >, <=, >= são relacionais e convertem operandos para números (ou comparam strings lexicograficamente). Os operadores relacionais têm precedência maior que os operadores de igualdade, portanto a < b == c é avaliado como (a < b) == c.

Boas Práticas

  • Prefira Operadores Estritos: Use === e !== para evitar erros da conversão automática de tipos.
  • Condições Claras: Torne suas condições claras e diretas, especialmente quando envolvem comparações.
  • Teste Casos Extremos: Sempre verifique os casos extremos nas suas comparações, especialmente ao lidar com entradas do usuário ou tipos de dados variáveis.

Conclusão

Compreender os operadores de comparação em JavaScript é fundamental para tomar decisões corretas nos seus programas. Seguindo essas diretrizes e entendendo tanto os comportamentos típicos quanto os atípicos, você poderá escrever código mais confiável e previsível. Conforme você continua a explorar o JavaScript, use esses operadores criteriosamente para gerenciar com eficácia os diversos desafios de programação.

Prática

Prática
Quais dos seguintes operadores de comparação podem ser usados em JavaScript?
Quais dos seguintes operadores de comparação podem ser usados em JavaScript?
Was this page helpful?