Undefined類型只有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined,例如:
var message; alert(message == undefined); //true
這個例子只聲明了變量message,但未對其進行初始化。比較這個變量與undefined字面量,結果表明它們是相等的。這個例子與下面的例子是等價的:
var message = undefined; alert(message == undefined); //true
這個例子使用undefined值顯式初始化了變量message。但我們沒有必要這麼做,因為未經初始化的值默認就會取得undefined值。
不過,包含undefined值的變量與尚未定義的變量還是不一樣的。看看下面的例子:
var message; //這個變量聲明之後默認取得了undefined值 alert(message); //“undefined” alert(age); //發生錯誤
運行上面的代碼,第一個警告框會顯示變量message的值,即“undefined”。而第二個警告框——由於傳遞給alert()函數的是尚未聲明變量age——則導致一個錯誤。對於尚未聲明過的變量,只能執行一項操作,即使用typeof操作符檢測其數據類型。
然而,對於未初始化的變量執行typeof操作符會返回undefined值,而對未聲明的變量執行typeof操作符同樣也會返回undefined值。來看下面的例子:
var message; alert(typeof message); //“undefined” alert(typeof age); //“undefined”
結果表明,對未初始化和未聲明的變量執行typeof操作符都返回了undefined值;這個結果有其邏輯上的合理性。因為雖然這兩種變量從技術上角度看有本質區別,但實際上無論對那種變量也不可能執行真正的操作。
即便未初始化的變量會自動賦予undefined值,但我們任然建議讀者養成顯式初始化變量(即在聲明變量的同時給變量賦值)的習慣。如果能夠做到這一點,那麼當typeof操作符返回undefined值時,我們就知道被檢測的變量是有還是沒有被聲明的,而不是尚未初始化的了。