Lavorando con JavaScript si ha spesso a che fare con il valore undefined ma non sempre viene gestito correttamente.
Il valore undefined è associato alle variabili non inizializzate ed esiste una keyword unefined per controllare questa condizione.
Però non sempre può essere usata per fare dei test, ad esempio questo:
a === undefined
genera un eccezione di tipo
ReferenceError: a is not defined
questo perchè la variabile non è stata dichiarata. Questo invece:
var a;
a === undefined
ritorna correttamente true senza sollevare eccezioni.
Per testare se una variabile è stata definita o meno va usata la keyword typeof:
 
//non dichiaro la variabile
typeof b === 'undefined'
il cui risultato va confrontato con la stringa "undefined". Il risualtato sarà true senza sollevare eccezioni.
Per comparare uso 3 uguali (Strict Equality Comparison) questo per fare una comparazione esatta di valore e tipo a differenza del doppio uguale (Abstract Equality Comparison) che cerca di fare un cast tra i due tipi e quindi risulta meno efficente. Ad esempio 1=='1' (numero e stringa che rappresenta un numero) ritorna true. Vedi Equality comparisons and sameness.

L'uso della keyword typeof diventa indispensabile quando si lavora su progetti ampi dove il codice è distribuito su più file e si vuole avere la certezza che la variabile sia definita prima di accedere o semplicemente sollevare un eccezione gestita nell'interfaccia utente se la variabile non è definita.

Il controllo con undefined può tornare utile anche nelle funzioni per gestire se uno o più parametri sono stati passati o meno:
 
function test(p){
  if(p === undefined)  //in alternativa typeof === 'undefined'
    console.log('paramentro NON passato');
  else
    console.log('parametro passato di tipo: ' + (typeof p));
}
che da questi risultati:
 
test();  // paramentro NON passato
test(1);  // parametro passato di tipo: number
test('ciao');  // parametro passato di tipo: string