¿Qué diferencias existen entre null y undefined en JavaScript?

29/06/2020Artículo original

Tanto null como undefined en JavaScript son valores bastante extraños, sobre todo para los principiantes. Ambos sirven para algo muy parecido, que es indicar la ausencia de valor. Lo que ocurre es que undefined es un valor que denota que no hay valor porque no se ha definido todavía, mientras que null se usa para indicar que no hay valor porque así lo hemos querido indicar expresamente. Pero en ambos casos el significado último de “ausencia de valor” es el mismo. Sin embargo ¿en qué se diferencian? Pues en muchas cosas… Vamos a verlas.

Cuando declaras una variable sin inicializarla, así:

var miVariable;console.log(miVariable);

Verás por consola su valor, que es undefined, que quiere decir que la variable está declarada pero no se ha definido aún su valor.

Sin embargo imagina que ya has utilizado una determinada variable y no quieres utilizarla más, o que tienes asignada una referencia a un objeto pero ya no lo necesitas o que, directamente, quieres tener la variable declarada pero inicializarla con un valor que todavía no sabes qué va a ser exactamente. En todos estos casos lo suyo es asignarle un valor nulo:

var miVariable = null;console.log(miVariable);

que en este caso mostrará el valor null por consola.

  Cómo leer cualquier artículo de Internet sin publicidad, ni comentarios y sin aceptar cookies

Ambos valores son valores de tipo “falsoso”, es decir, que actúan como false en las comparaciones. También ambos son tipos básicos de JavaScript, es decir, tipos primitivos como los números o las cadenas, parte intrínseca del lenguaje.

Una cosa curiosa de su uso es la comparación entre ambos valores. Precisamente por las particularidades que tienen, JavaScript a veces tiene que tratar estos dos tipos de manera especial también. Si haces una comparación no estricta entre ellos (con ==), como ambos significan la ausencia de valor, la comparación devuelve un true:

O sea, que aparentemente los considera iguales. Sin embargo, cuando haces una comparación estricta (con ===), dado que en realidad no son lo mismo, te devuelve un false:

De hecho, esta situación es tan especial que el propio estándar ECMAScript define explícitamente cómo debe hacerse para este caso en particular (en caso de duda, siempre conviene ir al estándar):

Por eso es mejor generalmente usar la igualdad estricta que la “relajada”, y no solo con estos valores “especiales”.

Otra diferencia entre ellos es que aunque puedes asignar explícitamente el valor undefined a una variable para dejarla sin inicializar:

  Códigos secretos y ocultos para Android

y por lo tanto es una asignación válida de JavaScript, no puedes utilizar esta asignación en JSON porque te daría un error al procesarlo. Por ejemplo, esto es lo que indica el parser de JSON de Firefox al intentar abrir un objeto JSON que tiene una propiedad con el valor undefined asignado:

Esto no quiere decir que no podamos usarlo en JavaScript (aunque no lo recomiendo):

pero en el estándar ECMA para JSON dice explícitamente los valores que están soportados y no esta undefined:

Así que si lo intentas “parsear” con JSON.parse() fallará estrepitosamente:

Si intentas usar undefined en una operación matemática, te devolverá un NaN (algo que no es un número), ya que no es un número ni hay una conversión implícita:

Sin embargo, si haces lo mismo con null, sorprendentemente funciona ya que null se considera un 0 en las operaciones matemáticas:

Otra diferencia más.

Finalmente, puedes averiguar si un valor está sin definir con typeof, que devolverá la cadena “undefined” ya que, como dije antes es un tipo intrínseco. Sin embargo en el caso de null, typeof devolverá “Object” ya que lo considera un objeto sin inicializar:

  Da potencia y flexibilidad a tus tests con Jest

Como vemos, aunque muy similares, sus objetivos son muy diferentes y son tratados de manera muy distinta por JavaScript (y JSON).

¡Espero que te resulte útil!

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad