2010-12-05 13 views
8

Puede este códigoComprobación de nulo/sin definir en JavaScript

if (typeof foo != "undefined" && foo !== null) { } 

refactorizar con seguridad en este código?

if (foo != null) { } 

¿Es exactamente lo mismo? (Y si no, ¿cómo es diferente?)

+0

posible duplicado de http://stackoverflow.com/questions/801032/null-object-in-javascript – Hps

+0

@Hps Busqué en SO. Esta pregunta nunca ha sido hecha. –

Respuesta

11

Realmente no. Obtendrá una excepción ReferenceError en su segundo ejemplo si no se ha declarado foo.

Por otro lado, puede verificar con seguridad las variables indefinidas no declaradas con el operador typeof.

+0

@Daniel No entiendo. Si tengo 'var foo;' y luego ejecuto el segundo fragmento, no se lanzará ningún error (al menos no en Chrome). –

+0

@Sime: prueba 'if (aNewFoo! = Null) {}' sin declarar 'var aNewFoo;' before. Luego intente 'if (typeof aNewFoo! = 'Undefined') {}', nuevamente sin declarar la variable ... Esa es la diferencia. –

+0

@Daniel Aha, por lo que si 'foo' no se declara, se lanzará un error, y si se declara pero ocurre que contiene el valor indefinido, no se generará ningún error. ¿Correcto? –

2

Un sencillo experimento será responder a esta pregunta: ¿

if(foo != null) { 
    alert('foo not null'); 
} 

el ejemplo anterior se obtiene un error de JavaScript en muchos navegadores: "ReferenceError: Can't find variable: foo". Esto se debe a que hemos utilizado una variable que no se ha declarado previamente como un argumento o var en el ámbito actual.

el operador typeof, por otro lado, hace un alojamiento explícita de variables que no se han definido - se vuelve 'undefined', por lo que:

if(typeof foo != 'undefined') { 
    alert('foo is not defined'); 
} 

funciona como se espera.

Así que la respuesta es "no" - no son la misma cosa - aunque en algunos Javascript entornos que pueden comportarse de la misma manera, en otros entornos su segunda forma producirán errores cuando no es foo definido.

2

Las variables pueden contener el valor undefined, que es el valor predeterminado si nunca se ha asignado una variable. Así que foo != null funcionará si su variable se declara usando var o se le asigna un valor a través de la asignación, pero si no lo es, obtendrá un error de referencia. Por lo tanto, los dos fragmentos son no equivalente.

Si usted puede estar seguro de que foo se declara, esto es seguro y fácil de entender que el segundo fragmento original, suponiendo que en ninguna parte del código algo así como undefined = 42 existe:

if(foo !== undefined && foo !== null) { } 
+0

Entonces, si 'foo' ha sido declarado (como en' var foo; '), entonces mis dos fragmentos son equivalentes. Pero si 'foo' no se ha declarado, los dos fragmentos no son iguales, porque el segundo fragmento arroja un error. ¿Correcto? –

+0

@ Šime Vidas: Por lo que puedo decir, sí. Sigo pensando que el fragmento original es mejor porque es más claro lo que hace. Para citar el JavaScript de Douglas Crockford: The Good Parts: "Los gemelos malvados hacen lo correcto cuando los operandos son del mismo tipo, pero si son de diferentes tipos, intentan coaccionar los valores. Las reglas por las que lo hacen son complicados y no memorables ". – PleaseStand

+0

Sí, el primer fragmento es el camino a seguir. Pensé que puedo simplificar esa comprobación (ya que null == undefined en JavaScript), pero resulta que no puedo. –

Cuestiones relacionadas