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)`?
Respuesta
!x
volverá true
para cada valor "Falsy" (cadena vacía, 0
, null
, false
, undefined
, NaN
), mientras que x == null
sólo devolverá true
si x
esnull
(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
):
- Si Tipo ( x) es el mismo que el Tipo (y), entonces
(...)- Si x es nula y y es indefinido, volver cierto.
- Si x es indefinido y y es nula , volver cierto.
- (...)
(...)
"undefined == null" devuelve true, también. por eso es mejor usar "x === null". – fforw
@justkt, @fforw: Gracias, actualicé mi respuesta. –
@downvoter: Explique para que pueda corregir/mejorar mi respuesta. ¿Qué está mal? –
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.
tipo indefinido coacciona a nulo, entonces (x == nulo) es cierto para indefinido, aunque (x === nulo) no lo es. – justkt
Sí, buena captura @justkt, actualizaré la respuesta para referencia futura. –
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)
!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.
if (!x)
coacciona x utiliza la función ToBoolean interna
if (x==null)
coacciona ambos operandos usando la función interna ToPrimitive (que generalmente resuelve cada lado a un número, de vez en cuando una cadena, dependiendo de los operandos)
Para la explicación completa de ToBoolean vs ToPrimitive ver http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
Esta pregunta/respuesta tiene alguna isTrue isFal SE funciones que pueden ayudar a la gente:
- 1. ¿Hay alguna diferencia entre `if bool (x)` y `if x` en Python?
- 2. ¿Cuál es la diferencia entre x ++ y ++ x
- 3. ¿Cuál es la diferencia entre X = X ++; vs X ++ ;?
- 4. #if defined (x) || (y); es esto valido?
- 5. ¿Cuál es la diferencia entre IF-ELSE y SWITCH?
- 6. ¿Cuál es la diferencia entre 'var $ x' y 'var x' en javascript?
- 7. ¿Cuál es la diferencia entre if (! Variable) y if (isset ($ variable))?
- 8. ¿Cuál es la diferencia entre null y System.DBNull.Value?
- 9. Diferencia entre x: Clave y x: Nombre
- 10. ¿Cuál es la diferencia entre if (CONST == variable) o if (variable == CONST)?
- 11. ¿Cuál es la diferencia de rendimiento, si existe, entre if (! Foo) y if (foo == false) en Java?
- 12. Diferencia entre if -e y si -f
- 13. ¿Cuál es la diferencia en R entre idéntico (x, y) e isTRUE (all.equal (x, y))?
- 14. Objective-C: ¿Cuál es la diferencia entre NULL, nil y @ ""?
- 15. R, ¿Cuál es la diferencia entre df [ "x"] y $ df x
- 16. Haskell: ¿Cuál es la diferencia entre (+1) y (\ x-> x + 1)?
- 17. ¿Cuál es la diferencia entre x: Key y x: Nombre en WPF?
- 18. if()</ dev/null
- 19. ¿Hay alguna diferencia entre usar múltiples declaraciones if y declaraciones if if?
- 20. Diferencia entre la directiva de preprocesador #if y normal si
- 21. C: diferencia entre (int) x y floor (x)?
- 22. ¿cuál es la diferencia entre text/javascript y aplicación/javascript
- 23. ¿Cuál es la diferencia entre las macros "#define STR (x) #x" y "#define STR (x) VAL (x)" con "#define VAL (x) #x"?
- 24. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 25. taquigrafía sentencia if/else Javascript
- 26. ¿Cuál es la diferencia entre int x = 1 e int x (1) en C++?
- 27. En Perl, ¿cuál es la diferencia entre "si se define $ count" y "if $ count"?
- 28. ¿Cuál es la diferencia entre #if y #ifdef Objective-C preprocessor macro?
- 29. diferencia entre UNHEX y X (MySQL)
- 30. Diferencia entre "importar X" y "de X import *"?
http://stackoverflow.com/questions/801032/null-object-in-javascript –
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
@Rudie: una manzana no es una naranja y una manzana no es una banana. ¿Qué está mal con eso? – Bergi