Undefined類型隻有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined,例如
03-09UndefinedExample01.htm
var message;
alert (nessage == undefined); true
這個例子隻聲明了變量message,但未對其進行初始化。比較這個變量與undefined字面量,結果表明它們是相等的。這個例子與下面的例子是等價的:
03-09UndefinedExample02.htm
var message = undefined;
console.log(message == undefined); // true
這個例子使用
undefined
值顯式初始化了變量message。但我們沒有必要這麼做,因為未經初始化的值預設就會取得
undefined
值。
一般而言,不存在需要顯式地把一個變量設定為
undefined
值的情況。字面值
undefined
的主要目的是用于比較,而ECMA-262第3版之前的版本中并沒有規定這個值。第3版引入這個值是為了正式區分空對象指針與未經初始化的變量。
不過,包含
undefined
值的變量與尚未定義的變量還是不一樣的。看看下面這個例子:
03-09UndefinedExample03.htm
var message;
console.log(message); // "undefined"
console.log(age); //causes an error
運作以上代碼,第一個警告框會顯示變量message的值,即
undefined
。而第二個警告框由于傳遞給alert()函數的是尚未聲明的變量age — 則會導緻一個錯誤。對于尚未聲明過的變量,隻能執行一項操作,即使用typeof操作符檢測其資料類型(對未經聲明的變量調用delete不會導緻銷誤,但這樣做沒什麼實際意義,而且在嚴格模式下确實會導緻錯誤)。
然而,令人困惑的是:對未初始化的變量執行typeof操作符會傳回undefined值,而對未聲明的變量執行typeof操作符同樣也會傳回undefined值。來看下面的例子:
03-09UndefinedExample04.htm
var message;
console.log(typeof message); // "undefined"
console.log(typeof age); // "undefined"