¿Por qué "verdadero" == verdadero muestra falso en JavaScript?


89

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" == truelo siguiente:

  1. ¿Son del mismo tipo? No
  2. ¿Es el operando un número o un booleano? si
  3. ¿Podemos convertir ambos en un número? No ( isNaN(Number("true")) // true)
  4. ¿Es alguno de los operandos una cadena? si
  5. ¿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?



6
Con tanto JavaScript alrededor, mundo es un lugar peligroso: if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "no sí"
user1068352

1
Debo decir que estoy sorprendido, y es tan estúpido que esto suceda. Otra razón más para usar siempre siempre ===
BT

Respuestas:


89

Porque "true"se convierte en NaN, mientras que truese convierte en1 . Entonces difieren.

Como informó, ambos se convierten en números, porque al menos truese puede (ver el comentario de Erik Reppen) y luego se comparan.


Can we convert both to a number?Entonces, ¿puedes decirme cuándo el paso será falso? Si par NaNes un número, ¿cómo puede fallar este paso?
Isaac

5
Cualquiera contra ninguno. Si ambos resultaran en NaN, cambiarían a la evaluación de cadenas. Si solo se puede convertir uno, todavía hay una comparación de números.
Erik Reppen

2
En realidad, hay algunos objetos extraños en Javascript que se comportan de manera bastante extraña. Por ejemplo, los documentos XML en IE <9 generan un error cuando intenta convertirlos en números.
MaxArt

Puede ver las conversiones usted mismo haciendo Number(true)yNumber('true')
Erik Reppen

10

El ==operador de comparación se define en ECMA 5 como:

  1. Si Tipo (x) es Número y Tipo (y) es Cadena,
    devuelve el resultado de la comparación x == ToNumber (y).
  2. Si Tipo (x) es Cadena y Tipo (y) es Número,
    devuelve el resultado de la comparación ToNumber (x) == y.
  3. Si Type (x) es booleano, devuelve el resultado de la comparación ToNumber (x) == y.
  4. Si Type (y) es booleano, devuelve el resultado de la comparación x == ToNumber (y).

Entonces, "verdadero" == verdadero se evalúa como:

  1. "true" == ToNumber (true)   (mediante la regla 7)
  2. "verdadero" == 1
  3. ToNumber ("true") == 1   (mediante la regla 5)
  4. NaN == 1

===> falso


3

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.


¿Deduje lo correcto de la siguiente manera? "verdadero" == verdadero se convierte en "verdadero" == 1 y luego se convierte en "verdadero" == "1" ¿Es por eso que devuelven falso?
vuquanghoang
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.