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.