valores triple objetos igualdades comparar cadenas array javascript

javascript - triple - Comparación de cadenas implícitas, 0='''', pero 1=''1''



igualdades javascript (6)

Estaba depurando algo y descubrí algo extraño en JavaScript:

alert(1=='''') ==> false alert(0=='''') ==> true alert(-1=='''') ==> false

Tendría sentido que una comparación implícita de cadena que 0 debería = ''0''. Esto es cierto para todos los valores distintos de cero, pero ¿por qué no para cero?


Cuando javascript realiza conversiones de tipo implícito, el literal de la cadena vacía coincidirá con el entero 0. Haz tu comparación así y obtendrás el resultado esperado:

alert(1==='''') ==> false alert(0==='''') ==> false alert(-1==='''') ==> false


De acuerdo con la documentación de Mozilla sobre operadores de comparación de Javascript

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 cualquiera de los operandos es una cadena, el otro se convierte en una cadena

Lo que está sucediendo realmente es que las cuerdas se están convirtiendo en números. Por ejemplo:

1 == ''1'' convierte en 1 == Number(''1'') convierte en 1 == 1 : true

Entonces prueba este: 1 == ''1.'' se convierte en 1 == Number(''1.'') convierte en 1 == 1 : true Si se convirtieran en cadenas, entonces obtendría ''1'' == ''1.'' , que sería falso

Sucede que el Number('''') == 0 , por lo tanto 0 == '''' es verdadero


ECMA-262, 3ª edición, 11.9.3 con respecto a x == y , paso 16:

Si Type (x) es Number y Type (y) is String, devuelve el resultado de la comparación x == ToNumber (y).

La cadena vacía '''' se convierte a 0 antes de la comparación.


En muchos idiomas, la cadena vacía se puede forzar a falso.

Tenga cuidado de hacer comparaciones con == en lugar de ===:

alert('''' == ''0''); //false alert(0 == ''''); // true alert(0 ==''0''); // true

== no es transitivo


Este es solo uno de los juegos verdaderamente horribles que entró en el compromiso de JavaScript. '''' y 0 son valores no inicializados (igual a booleano falso) y, por lo tanto, iguales.

Para protegerse de errores extraños como este, es mejor usar siempre el operador ===.


Javascript, como PHP, está débilmente tipeado *. Entonces, cuando comparas 0 con '''', el motor JS los convierte a un tipo de datos similar. Como 0 y '''' ambos equivalen a booleano (falso), "falso == falso" es verdadero.

* Los lenguajes débilmente tipados no requieren que las variables sean de un tipo de datos específico, por lo que puede establecer una variable como una cadena, cambiarla a int, float y volver a la cadena sin que el procesador genere errores.