Eu me deparei com um exemplo de código que estava usando essa comparação:
var someVar = 0;
Object.is(false, someVar); //Returns false
Eu sei que false == 0
será true
por isso que temos ===
.
Qual é a Object.is
diferença ===
?
fonte
Eu me deparei com um exemplo de código que estava usando essa comparação:
var someVar = 0;
Object.is(false, someVar); //Returns false
Eu sei que false == 0
será true
por isso que temos ===
.
Qual é a Object.is
diferença ===
?
===
é chamado operador de comparação estrita em JavaScript. Object.is
e o operador de comparação estrita se comporta exatamente da mesma maneira, exceto NaN
e +0/-0
.
Do MDN:
Object.is()
O método não é o mesmo que ser igual, de acordo com o===
operador. O===
operador (e também o==
operador) trata os valores numéricos -0 e +0 como iguais e trataNumber.NaN
como não iguais aNaN
.
O código abaixo destaca a diferença entre ===
e Object.is()
.
console.log(+0 === -0); //true
console.log(Object.is(+0, -0)); //false
console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); //true
console.log(Number.NaN === Number.NaN); // false
console.log(Object.is(Number.NaN, Number.NaN)); // true
console.log(NaN === Number.NaN); // false
console.log(Object.is(NaN, Number.NaN)); // true
Você pode encontrar mais exemplos aqui .
Nota : Object.is
faz parte da proposta do ECMAScript 6 e ainda não é amplamente suportado (por exemplo, não é suportado por nenhuma versão do Internet Explorer ou por muitas versões anteriores de outros navegadores). No entanto, você pode usar um polyfill para navegadores não-ES6, que pode ser encontrado no link fornecido acima.
.x
em uma string encaixota em umString
objeto (e não em um valor primitivo da string) e a comparação seria entre um objeto e uma string - isso é muito sutil e é uma armadilha - a estática evita esses problemas, os métodos estáticos são mais simples e fáceis de usar.document.createElement('div').isEqualNode(document.createElement('div')) === true
Object.is
usa o algoritmo SameValue da especificação , enquanto===
usa o algoritmo de igualdade estrita . Uma observação sobre o algoritmo de igualdade estrita destaca a diferença:Observe que:
NaN === NaN
é falso, masObject.is(NaN, NaN)
é verdadeiro+0 === -0
é verdade, masObject.is(+0, -0)
é falsa-0 === +0
é verdade, masObject.is(-0, +0)
é falsaJavaScript possui pelo menos quatro tipos de "igualdade":
==
), onde os operandos serão coagidos a tentar fazê-los corresponder. As regras são claramente especificadas , mas não óbvias. ("" == 0
étrue
;"true" == true
éfalse
, ...).===
), onde operandos de tipos diferentes não serão coagidos (e não serão iguais), mas veja a nota acima sobreNaN
e zero positivo e negativo.Object.is
).SameValue
exceto,+0
e-0
é o mesmo em vez de diferente (usado porMap
para chaves e porArray.prototype.includes
).Também há equivalência de objetos , que não é fornecida pelo idioma ou pelo próprio tempo de execução, mas geralmente é expressa como: Os objetos têm o mesmo protótipo, mesmas propriedades e seus valores de propriedade são os mesmos (por uma definição razoável de "o mesmo" )
Algoritmo SameValue :
... onde SameValueNonNumber é:
Algoritmo de igualdade estrita :
fonte
A descrição acima é a função polyfill para mostrar como
Object.is
funciona, para quem estiver interessado em saber. Uma referência a Você-Não-Sabe-JSfonte
Resumo:
A
Object.is()
função aceita 2 valores como argumentos e retorna true se os 2 valores fornecidos forem exatamente iguais, caso contrário, retornará false.Por que nós precisamos disso?
Você pode pensar que já temos uma igualdade estrita (verifica tipo + valor) verificando javascript com o
===
operador, por que precisamos dessa função? Bem, a igualdade estrita não é suficiente em alguns casos e são os seguintes:Object.is()
nos ajuda a comparar esses valores para ver se são semelhantes, algo que o operador de igualdade estrita não pode fazer.fonte
Em poucas palavras, eles são semelhantes, mas
Object.is
são mais inteligentes e mais precisos ...Vejamos isso ...
Mas isso não está totalmente certo, pois ignora
-
e+
antes ...Agora usamos:
Como você vê, é mais preciso comparar isso.
Também no caso de
NaN
que funciona mais como correto, como considereNaN
o mesmo.fonte