undefined 和 null
JavaScript 有兩個(gè)表示“空”的值,其中比較有用的是 undefined。
undefined的值
undefined 是一個(gè)值為 undefined 的類型。
js定義了一個(gè)全局變量,它的值是 undefined,這個(gè)變量也被稱為 undefined。 但是這個(gè)變量不是一個(gè)常量,也不是一個(gè)關(guān)鍵字。這意味著它的值可以輕易被覆蓋。
在 ECMAScript 5 的嚴(yán)格模式下,undefined 不再是可寫(xiě)的了。 但是它的名稱仍然可以被隱藏,比如定義一個(gè)函數(shù)名為 undefined。
下面的情況會(huì)返回 undefined 值:
- 訪問(wèn)未修改的全局變量 undefined。
- 由于沒(méi)有定義 return 表達(dá)式的函數(shù)隱式返回。
- return 表達(dá)式?jīng)]有顯式地返回任何內(nèi)容。
- 訪問(wèn)不存在的屬性。
- 函數(shù)參數(shù)沒(méi)有被顯式的傳遞值。
- 任何被設(shè)置為 undefined 值的變量。
處理 undefined 值的改變
由于全局變量 undefined 只是保存了 undefined 類型實(shí)際值的副本, 因此對(duì)它賦新值不會(huì)改變類型 undefined 的值。然而,為了方便其它變量和 undefined 做比較,我們需要事先獲取類型 undefined 的值。
為了避免可能對(duì) undefined 值的改變,一個(gè)常用的技巧是使用一個(gè)傳遞到匿名包裝器的額外參數(shù)。 在調(diào)用時(shí),這個(gè)參數(shù)不會(huì)獲取任何值。
var undefined = 123; (function(something, foo, undefined) { // 局部作用域里的 undefined 變量重新獲得了 `undefined` 值 })(‘Hello World’, 42);
另外一種達(dá)到相同目的方法是在函數(shù)內(nèi)使用變量聲明。
var undefined = 123; (function(something, foo) { var undefined; … })(‘Hello World’, 42);
這里唯一的區(qū)別是,在壓縮后并且函數(shù)內(nèi)沒(méi)有其它需要使用 var 聲明變量的情況下,這個(gè)版本的代碼會(huì)多出 4 個(gè)字節(jié)的代碼。
如果此函數(shù)內(nèi)沒(méi)有其它需要聲明的變量,那么 var 總共 4 個(gè)字符(包含一個(gè)空白字符) 就是專門(mén)為 undefined 變量準(zhǔn)備的,相比上個(gè)例子多出了 4 個(gè)字節(jié)。
null 的用處
JavaScript 中的 undefined 的使用場(chǎng)景類似于其它語(yǔ)言中的 null,實(shí)際上 JavaScript 中的 null 是另外一種數(shù)據(jù)類型。
它在 JavaScript 內(nèi)部有一些使用場(chǎng)景(比如聲明原型鏈的終結(jié) Foo.prototype = null),但是大多數(shù)情況下都可以使用 undefined 來(lái)代替。