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

29/06/2020
Artí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.

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 son iguales??

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:

Pues va a ser que no...

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):

captura de pantalla del estándar en la que dice explícitamente que no son iguales

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:

var miVariable = 1; miVariable = undefined; console.log(miVariable);

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:

Imagen que muestra cómo el JSON da error al parsearlo

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

La imagen muestra como undefined sí funciona en JSON de JavaScript

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

Los valores válidos son objetos, arrays, números, cadenas, true, false y null

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

La imagen muestra el error que produce JSON.parse al parsear JSON con un undefined

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:

Operación aritmética con undefined produce NaN

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

En las operaciones matemáticas null se considera como un cero

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:

los resultados de typeof con undefined y null

 

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!