Operadores de Igualdade ECMAScript

�断两个变量是否相等是程序设计中非常重要的运算。在处理原始值时,这种运算相当简单,但涉及对象,任务就稍有点复杂。

O ECMAScript fornece dois conjuntos de operadores de igualdade: os operadores de igualdade e desigualdade são usados para lidar com valores primitivos, os operadores de igualdade e desigualdade totais são usados para lidar com objetos.

Operadores de igualdade e desigualdade

No ECMAScript, o operador de igualdade é representado por dois iguais (==), ele retorna true quando e apenas quando os dois operandos forem iguais. O operador de desigualdade é representado por um exclamativo seguido de um igual (!=), ele retorna true quando e apenas quando os dois operandos forem diferentes. Para determinar se dois operandos são iguais, esses dois operadores fazem conversão de tipo.

As regras para a conversão de tipo são as seguintes:

  • Se um operando for um valor Booleano, antes de verificar a igualdade, converta-o para o valor numérico. false converte para 0, true para 1.
  • Se um operando for uma string e o outro for um número, antes de verificar a igualdade, tentar converter a string para um número.
  • Se um operando for um objeto e o outro for uma string, antes de verificar a igualdade, tentar converter o objeto para uma string.
  • Se um operando for um objeto e o outro for um número, antes de verificar a igualdade, tentar converter o objeto para um número.

Ao comparar, o operador também observa as seguintes regras:

  • Os valores null e undefined são iguais.
  • Ao verificar a igualdade, não pode converter null e undefined em outros valores.
  • Se algum operando for NaN, o operador de igualdade retornará false e o operador de desigualdade retornará true.
  • Se os dois operandos forem objetos, é comparado o valor de referência deles. Se os dois operandos apontarem para o mesmo objeto, o operador de igualdade retorna true, caso contrário, os dois operandos não são iguais.

Aviso importante:Mesmo que os dois números sejam NaN, o operador de igualdade ainda retorna false, porque, de acordo com as regras, NaN não é igual a NaN.

A tabela a seguir lista alguns casos especiais e seus resultados:

expressão valor
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

Operador de igualdade completa e operador de desigualdade completa

Os operadores de igualdade e desigualdade equivalentes são o operador de igualdade completa e o operador de desigualdade completa. Esses operadores fazem a mesma coisa que os operadores de igualdade e desigualdade, mas eles não executam conversão de tipo antes de verificar a igualdade.

O operador de igualdade completa é representado por três sinais de igual (===), e retorna true apenas quando os operandos são iguais sem conversão de tipo.

Por exemplo:

var sNum = "66";
var iNum = 66;
alert(sNum == iNum); // Saída "true"
alert(sNum === iNum); // Saída "falso"

Neste código, o primeiro alert usa o sinal de igual para comparar a string "66" com o número 66, resultando em "true". Como mencionado anteriormente, isso ocorre porque a string "66" será convertida para o número 66, antes de ser comparada com o outro número 66. O segundo alert usa o operador de igualdade completa para comparar a string e o número sem conversão de tipo, claro, a string não é igual ao número, então a saída é "falso".

O operador de desigualdade completa é representado por um sinal de exclamação seguido de dois sinais de igual (!==), e retorna true apenas quando os operandos não precisam de conversão de tipo e são diferentes.

Por exemplo:

var sNum = "66";
var iNum = 66;
alert(sNum != iNum); // Saída "falso"
alert(sNum !== iNum); // Saída "true"

Aqui, o primeiro alert usa o operador de desigualdade para transformar a string "66" em número 66, tornando-o igual ao segundo operando 66. Portanto, o resultado da computação é "falso", pois os dois operandos são iguais. O segundo alert usa o operador de desigualdade completa. A pergunta feita é: "sNum" é diferente de "iNum"? A resposta a essa pergunta é: sim (true), porque sNum é uma string e iNum é um número, eles, claro, são diferentes.