null は何かを返すべきですが、返すものがない場合。意図的に使われるものです。
undefined はただ何もない状態。定義されていない変数、オブジェクトの定義されていないプロパティ、何も return しない関数の返り値などは全て undefined です。
typeof の結果
console.log(typeof null);
// object
console.log(typeof undefined);
// undefined
undefined という変数を定義する
グローバルより内側のスコープでは undefined という変数を定義できてしまいます。null ではそういうことはありません。
var foo;
console.log(foo === undefined);
// true
console.log(foo == null);
// true
(function () {
var undefined = 12;
console.log(undefined);
// 12
console.log(foo === undefined);
// false
console.log(foo == null);
// true
console.log(typeof foo === 'undefined');
// true
})();
それぞれの判別方法
undefined そのものかどうかを知りたい場合は typeof foo === 'undefined'。
null そのものかどうかを知りたい場合は foo === null。
どちらかかどうかを知りたい場合は foo == null ですかね。以下に示すように null と undefined 以外では false になります。
console.log(undefined == null);
// true
console.log(false == null);
// false
console.log(0 == null);
// false
console.log(NaN == null);
// false