<p>
Undefined 類型只有一個值,即特殊的 undefined。在使用 var 聲明變量但未對其加以初始化時,這個變量的值就是 undefined,例如:
</p>
<pre>var message;
alert(message == undefined); //true</pre>
<a href="http://www.shouce.ren/study/api/s/8350" target="_blank" class="btn btn-sm btn-success">運行一下</a><br />
UndefinedExample01.htm<br />
<p>
這個例子只聲明了變量 message,但未對其進行初始化。比較這個變量與 undefined 字面量,結果表明它們是相等的。這個例子與下面的例子是等價的:
</p>
<pre>var message = undefined;
alert(message == undefined); //true</pre>
<a href="http://www.shouce.ren/study/api/s/8351" target="_blank" class="btn btn-sm btn-success">運行一下</a><br />
<p>
這個例子使用 undefined 值顯式初始化了變量 message。但我們沒有必要這么做,因為未經初始化的值默認就會取得 undefined 值。
</p>
<p>
</p>
<blockquote>
一般而言,不存在需要顯式地把一個變量設置為 undefined 值的情況。字面值undefined 的主要目的是用于比較,而 ECMA-262 第 3 版之前的版本中并沒有規定這個值。第 3 版引入這個值是為了正式區分空對象指針與未經初始化的變量。
</blockquote>
<p>
</p>
不過,包含 undefined 值的變量與尚未定義的變量還是不一樣的。看看下面這個例子:<br />
<pre>var message; // 這個變量聲明之后默認取得了 undefined 值
// 下面這個變量并沒有聲明
// var age
alert(message); // "undefined"
alert(age); // 產生錯誤</pre>
<a href="http://www.shouce.ren/study/api/s/8352" target="_blank" class="btn btn-sm btn-success">運行一下</a><br />
<p>
運行以上代碼,第一個警告框會顯示變量 message 的值,即"undefined"。而第二個警告框——由于傳遞給 alert()函數的是尚未聲明的變量 age——則會導致一個錯誤。對于尚未聲明過的變量,只能執行一項操作,即使用 typeof 操作符檢測其數據類型(對未經聲明的變量調用 delete 不會導致錯誤,但這樣做沒什么實際意義,而且在嚴格模式下確實會導致錯誤)。
</p>
<p>
然而,令人困惑的是:對未初始化的變量執行 typeof 操作符會返回 undefined 值,而對未聲明的變量執行 typeof 操作符同樣也會返回 undefined 值。來看下面的例子:
</p>
<pre>var message; // 這個變量聲明之后默認取得了 undefined 值
// 下面這個變量并沒有聲明
// var age
alert(typeof message); // "undefined"
alert(typeof age); // "undefined"</pre>
<a href="http://www.shouce.ren/study/api/s/8353" target="_blank" class="btn btn-sm btn-success">運行一下</a><br />
<p>
結果表明,對未初始化和未聲明的變量執行 typeof 操作符都返回了 undefined 值;這個結果有其邏輯上的合理性。因為雖然這兩種變量從技術角度看有本質區別,但實際上無論對哪種變量也不可能執行真正的操作。
</p>
<blockquote>
即便未初始化的變量會自動被賦予 undefined 值,但顯式地初始化變量依然是明智的選擇。如果能夠做到這一點,那么當 typeof 操作符返回"undefined"值時,我們就知道被檢測的變量還沒有被聲明,而不是尚未初始化。
</blockquote>