2011-04-26 17 views
17

Cuál es la diferencia entre if (!x) y if (x == null); es decir, ¿cuándo pueden ser diferentes sus resultados?JavaScript: ¿Cuál es la diferencia entre `if (! X)` y `if (x == null)`?

+0

http://stackoverflow.com/questions/801032/null-object-in-javascript –

+4

Me encanta [este artículo] (http: //javascriptweblog.wordpress. com/2011/02/07/truth-equality-and-javascript /). ¿Sabía que tanto ''a' == false' y' 'a' == true' son 'false' =) Yeah. Imagínate. – Rudie

+0

@Rudie: una manzana no es una naranja y una manzana no es una banana. ¿Qué está mal con eso? – Bergi

Respuesta

46

!x volverá true para cada valor "Falsy" (cadena vacía, 0, null, false, undefined, NaN), mientras que x == null sólo devolverá true si xesnull (edición: o aparentemente undefined (véase abajo)).

Probar con x = 0, hay una diferencia.

Puede decir que el operador NOT !convierte un valor en su equivalente booleano opuesto. Esto es diferente a realmente comparando dos valores.

Además, si compara valores con ==, JavaScript type conversion puede provocar un comportamiento inesperado (como undefined == null). Es mejor utilizar siempre la comparación estricta === (el valor y el tipo deben ser los mismos) y hacer uso de la conversión de tipo solo si realmente sabe lo que está haciendo.

Algo para leer:


Actualización:

Para obtener más información acerca de la comparación no estricta de null y undefined (o la comparación en general), vale la pena echarle un vistazo al specification. El algoritmo de comparación se define allí (la comparación es x == y):

  1. Si Tipo ( x) es el mismo que el Tipo (y), entonces
    (...)
  2. Si x es nula y y es indefinido, volver cierto.
  3. Si x es indefinido y y es nula , volver cierto.
  4. (...)

(...)

+5

"undefined == null" devuelve true, también. por eso es mejor usar "x === null". – fforw

+0

@justkt, @fforw: Gracias, actualicé mi respuesta. –

+0

@downvoter: Explique para que pueda corregir/mejorar mi respuesta. ¿Qué está mal? –

4

Los resultados pueden ser diferentes si x es falsa, NaN '' (cadena vacía), sin definir (usando el operador de comparación estricta ===), o 0 (cero).

Consulte Felix Kling's answer para obtener un excelente resumen de la comparación de tipos.

+0

tipo indefinido coacciona a nulo, entonces (x == nulo) es cierto para indefinido, aunque (x === nulo) no lo es. – justkt

+0

Sí, buena captura @justkt, actualizaré la respuesta para referencia futura. –

2

Say x es una cadena.

x = undefined; 
if(!x) { 
    alert("X is not a truthy value"); 
} 
if(x == null) { 
    alert("X is null"); 
} 

x = ""; 
if(!x) { 
    alert("X is not a truthy value"); 
} 
if(x == null) { 
    alert("X is null"); 
} 

x = null; 
if(!x) { 
    alert("X is not a truthy value"); 
} 
if(x == null) { 
    alert("X is null"); 
} 

Se dará cuenta de que "X no es un valor Truthy" se muestra en los tres casos, pero sólo en el caso de que X sea indefinido o nula es "X es nulo" que se muestra.

Cuando X es un valor booleano, entonces (!x) será verdadero cuando X es falso pero (x == null) no lo será. Para los números 0 y NaN se consideran valores falsos, entonces X no es verdad.

See it in action, incluyendo la diferencia entre == (igualdad usando conversión de tipo) y === (igualdad estricta)

1

!x pruebas para un valor falso. Esto será cierto para cualquier valor que se pueda propagar a falso por cualquier razón. Esto será cierto para las permutaciones de false, 0, etc, etc

x == null es diferente porque var x = 0 no será nula ... pero será falsa.

Cuestiones relacionadas