JavaScript non definito e nullo


Esempio

A prima vista può sembrare che null e undefined siano fondamentalmente uguali, tuttavia ci sono differenze sottili ma importanti.

undefined è l'assenza di un valore nel compilatore, perché dove dovrebbe essere un valore, non è stato messo uno, come nel caso di una variabile non assegnata.

  • undefined è un valore globale che rappresenta l'assenza di un valore assegnato.
    • typeof undefined === 'undefined'
  • null è un oggetto che indica che una variabile è stata assegnata in modo esplicito "nessun valore".
    • typeof null === 'object'

Impostare una variabile su undefined significa che la variabile effettivamente non esiste. Alcuni processi, come la serializzazione JSON, possono undefined proprietà undefined dagli oggetti. Al contrario, le proprietà null indicano che saranno conservate in modo da poter esplicitamente trasmettere il concetto di una proprietà "vuota".

Le seguenti valutazioni undefined :

  • Una variabile quando viene dichiarata ma non assegnata ad un valore (cioè definito)
    • let foo;
      console.log('is undefined?', foo === undefined);
      // is undefined? true
      
  • Accedere al valore di una proprietà che non esiste
    • let foo = { a: 'a' };
      console.log('is undefined?', foo.b === undefined);
      // is undefined? true
      
  • Il valore di ritorno di una funzione che non restituisce un valore
    • function foo() { return; }
      console.log('is undefined?', foo() === undefined);
      // is undefined? true
      
  • Il valore di un argomento di funzione dichiarato ma che è stato omesso dalla chiamata di funzione
    • function foo(param) { 
        console.log('is undefined?', param === undefined);
      }
      foo('a');
      foo();
      // is undefined? false
      // is undefined? true
      

undefined è anche una proprietà dell'oggetto window globale.

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

Prima di ECMAScript 5 è possibile effettivamente modificare il valore della proprietà window.undefined su qualsiasi altro valore potenzialmente interrompendo tutto.