JavaScript comprueba si la variable existe (está definida/inicializada)

¿Qué método para comprobar si una variable ha sido inicializada es mejor/correcto? (Suponiendo que la variable pueda contener cualquier cosa (cadena, int, objeto, función, etc.))

if (elem) { // or !elem

o

if (typeof(elem) !== 'undefined') {

o

if (elem != null) {

Quieres el operador typeof. Específicamente:

if (typeof variable !== 'undefined') {
    // the variable is defined
}
Comentarios (19)

En la mayoría de los casos se utilizaría:

elem != null

A diferencia de un simple if (elem), permite 0, false, NaN y '', pero rechaza null o undefined, lo que lo convierte en un buen test general para la presencia de un argumento, o propiedad de un objeto.


Las otras comprobaciones tampoco son incorrectas, simplemente tienen usos diferentes:

  • if (elem): puede usarse si se garantiza que elem es un objeto, o si false, 0, etc. se consideran valores "por defecto" (por lo tanto equivalen a undefined o null).

  • La comprobación typeof elem == 'undefined'puede utilizarse en los casos en los que unnull` especificado tiene un significado distinto al de una variable o propiedad no inicializada.

  • Esta es la única comprobación que no arroja un error si elem no está declarado (es decir, no hay declaración var, no es una propiedad de window, o no es un argumento de función). Esto es, en mi opinión, bastante peligroso ya que permite que los errores tipográficos pasen desapercibidos. Para evitarlo, vea el siguiente método.


También es útil una comparación estricta contra undefined:

if (elem === undefined) ...

Sin embargo, debido a que el global undefined puede ser anulado con otro valor, es mejor declarar la variable undefined en el ámbito actual antes de usarla:

var undefined; // really undefined
if (elem === undefined) ...

O:

(function (undefined) {
    if (elem === undefined) ...
})();

Una ventaja secundaria de este método es que los minificadores JS pueden reducir la variable undefined a un solo carácter, ahorrando unos cuantos bytes cada vez.

Comentarios (4)

Depende de si sólo te importa que la variable haya sido definida o si quieres que tenga un valor significativo.

Comprobando si el tipo es indefinido se comprobará si la variable ya ha sido definida.

Si === null o !== null sólo comprobará si el valor de la variable es exactamente null.

== null o != null comprobará si el valor es undefined o null.

Si (valor) comprueba si la variable es "indefinida", "nula", "0" o una cadena vacía.

Comentarios (0)