JavaScript indefinido y nulo


Ejemplo

A primera vista, puede parecer que null e undefined son básicamente lo mismo, sin embargo, existen diferencias sutiles pero importantes.

undefined es la ausencia de un valor en el compilador, porque donde debería haber un valor, no se ha puesto uno, como en el caso de una variable no asignada.

  • undefined es un valor global que representa la ausencia de un valor asignado.
    • typeof undefined === 'undefined'
  • null es un objeto que indica que a una variable se le ha asignado explícitamente "sin valor".
    • typeof null === 'object'

Establecer una variable en undefined significa que la variable efectivamente no existe. Algunos procesos, como la serialización JSON, pueden quitar propiedades undefined de los objetos. En contraste, null propiedades null indican que se conservarán para que pueda transmitir explícitamente el concepto de una propiedad "vacía".

Los siguientes evalúan a undefined :

  • Una variable cuando se declara pero no se le asigna un valor (es decir, se define)
    • let foo;
      console.log('is undefined?', foo === undefined);
      // is undefined? true
      
  • Accediendo al valor de una propiedad que no existe.
    • let foo = { a: 'a' };
      console.log('is undefined?', foo.b === undefined);
      // is undefined? true
      
  • El valor de retorno de una función que no devuelve un valor
    • function foo() { return; }
      console.log('is undefined?', foo() === undefined);
      // is undefined? true
      
  • El valor de un argumento de función que se declara pero se ha omitido en la llamada de función
    • function foo(param) { 
        console.log('is undefined?', param === undefined);
      }
      foo('a');
      foo();
      // is undefined? false
      // is undefined? true
      

undefined también es una propiedad del objeto de window global.

// Only in browsers
console.log(window.undefined); // undefined
window.hasOwnProperty('undefined'); // true    
5

Antes de ECMAScript 5, realmente podría cambiar el valor de la propiedad window.undefined a cualquier otro valor que pueda romper todo.