MDC descreve o ==
operador da seguinte maneira :
Se os dois operandos não forem do mesmo tipo, JavaScript os converte e aplica a comparação estrita. Se o operando for um número ou booleano, os operandos serão convertidos em números, se possível; else se qualquer operando for uma string, o outro operando é convertido em uma string, se possível.
Com isso em mente, eu avaliaria o "true" == true
seguinte:
- Eles são do mesmo tipo? Não
- O operando é um número ou booleano? sim
- Podemos converter ambos em um número? Não (
isNaN(Number("true")) // true
) - Qualquer um dos operandos é uma string? sim
- Podemos converter o outro operando em uma string? Sim (
String(true) === "true" // true
)
Acabei com as strings "true"
e "true"
, que deve avaliar como true
, mas o JavaScript mostra falso.
O que eu perdi?
javascript
string
equals
Isaac
fonte
fonte
if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}
---> "não sim"Respostas:
Porque
"true"
é convertido paraNaN
, enquantotrue
é convertido para1
. Então eles são diferentes.Como você relatou, ambos são convertidos em números, porque pelo menos
true
podem ser (veja o comentário de Erik Reppen), e depois comparados.fonte
Can we convert both to a number?
será falso então? Se parNaN
for um número, como essa etapa pode falhar?Number(true)
eNumber('true')
O
==
operador de comparação é definido no ECMA 5 como:retorne o resultado da comparação x == ToNumber (y).
retorne o resultado da comparação ToNumber (x) == y.
Portanto, "true" == true é avaliado como:
===> falso
fonte
De acordo com o algoritmo de comparação de igualdade abstrata
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
se um dos oprends for booleano e o outro não, boolean é o conversor para o número 0 ou 1. então
true == "true"
é falso.fonte