2009-01-20 10 views

Respuesta

18

De acuerdo con la documentación de Mozilla en Javascript Comparison Operators

Si los dos operandos no son del mismo tipo, JavaScript convierte los operandos continuación, se aplica un estricto comparación. Si cualquiera de los operandos es un número o un booleano, los operandos son convertidos a números; Si bien operando es una cadena, el otro es convierte en una cadena

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

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

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

Lo que pasa es que Number('') == 0, por lo tanto, es cierto 0 == ''

2

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 idiomas 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 los errores de lanzamiento del procesador.

+0

1 Muy bonito - ¿sabe cómo el motor decide qué tipo de datos para convertir a? Obviamente, convertir 0 en una cadena no tendría los mismos resultados. –

+0

Esto está mal - '' se convertirá en 0, no booleano 'falso' – Christoph

+0

No, no estoy seguro. Sospecho que es un tipo numérico o un reparto booleano. – davethegr8

3

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 ===.

+0

0 y '' no son valores no inicializados . Son valores que se convierten implícitamente tipo al mismo valor en comparación. –

10

Cuando javascript realiza conversiones de tipo implícito, el literal de la cadena vacía coincidirá con el 0 entero. Haga su comparación de esta manera y obtendrá el resultado esperado:

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

+1 porque esta respuesta es realmente una solución! – NLemay

2

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

Guárdate de hacer comparaciones con == === en lugar de:

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

== no es transitiva.

4

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

Si Tipo (x) es el número y tipo (y) es String, devolver el resultado de la comparación x == ToNumber (y).

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

+1

+1 pero hacer que la especificación cite un enlace sería bueno – Greg

+0

@RoBorg: el enlace no funciona con archivos PDF, y buscar en Google ECMA-262 y hacer clic en el primer enlace no es una gran inconveniencia .. – Christoph

+0

@Christoph tampoco lo es googleando para "operador de igualdad de JavaScript" pero ese no es el punto – Greg