MDC describe al ==
operador de la siguiente manera :
Si los dos operandos no son del mismo tipo, JavaScript convierte los operandos y luego aplica una comparación estricta. Si alguno de los operandos es un número o un booleano, los operandos se convierten en números si es posible; de lo contrario, si alguno de los operandos es una cadena, el otro operando se convierte en una cadena si es posible.
Con esto en mente, evaluaría "true" == true
lo siguiente:
- ¿Son del mismo tipo? No
- ¿Es el operando un número o un booleano? si
- ¿Podemos convertir ambos en un número? No (
isNaN(Number("true")) // true
) - ¿Es alguno de los operandos una cadena? si
- ¿Podemos convertir el otro operando en una cadena? Si (
String(true) === "true" // true
)
Terminé con las cadenas "true"
y "true"
, que debería evaluar true
, pero JavaScript muestra falso.
¿Qué me he perdido?
javascript
string
equals
Isaac
fuente
fuente
if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}
---> "no sí"Respuestas:
Porque
"true"
se convierte enNaN
, mientras quetrue
se convierte en1
. Entonces difieren.Como informó, ambos se convierten en números, porque al menos
true
se puede (ver el comentario de Erik Reppen) y luego se comparan.fuente
Can we convert both to a number?
Entonces, ¿puedes decirme cuándo el paso será falso? Si parNaN
es un número, ¿cómo puede fallar este paso?Number(true)
yNumber('true')
El
==
operador de comparación se define en ECMA 5 como:devuelve el resultado de la comparación x == ToNumber (y).
devuelve el resultado de la comparación ToNumber (x) == y.
Entonces, "verdadero" == verdadero se evalúa como:
===> falso
fuente
Según el algoritmo de comparación de igualdad abstracta
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
si uno de los oprends es booleano y el otro no, boolean es convertidor al número 0 o 1. entonces
true == "true"
es falso.fuente