working operadores not localecompare example equal comparacion javascript string equals

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



operadores de comparacion javascript (3)

De acuerdo con 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 un booleano y otro no, boolean es el convertidor al número 0 o 1. entonces true == "true" es falso.

MDC describe el operador == siguiente manera :

Si los dos operandos no son del mismo tipo, JavaScript convierte los operandos y aplica una comparación estricta. Si cualquiera de los operandos es un número o un booleano, los operandos se convierten en números si es posible; de lo contrario, si un operando es una cadena, el otro operando se convierte en una cadena si es posible.

Con esto en mente, evaluaría "true" == true siguiente manera:

  1. ¿Son del mismo tipo? No
  2. ¿Es operand un número o un booleano?
  3. ¿Podemos convertir ambos a un número? No ( isNaN(Number("true")) // true )
  4. ¿Es operando una cadena?
  5. ¿Podemos convertir el otro operando a una cadena? ( String(true) === "true" // true )

Terminé con las cadenas "true" y "true" , que debería ser true , pero JavaScript muestra falsa.

¿Qué me he perdido?


Porque "true" se convierte a NaN , mientras que true se convierte a 1 . Entonces ellos difieren

Al igual que usted informó, ambos se convierten en números, porque al menos true puede ser (ver el comentario de Erik Reppen), y luego se compara.


== operador de comparación definido en Ecma 5 como

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

Entonces, "verdadero" == verdadero es interpretado por el motor js como

  1. "verdadero" == aNúmero (verdadero)
  2. "verdadero" == 1
  3. toNumber ("true") == 1
  4. NaN == 1

===> falso