1. 程式人生 > >區分JS的空值

區分JS的空值

方法 不同 能說 共同點 .get 語句 運算 ntb tor

區分JS中的undefined,null,"",0和false
在程序語言中定義的各種各樣的數據類型中,我們都會為其定義一個"空值"或"假值",比如對象類型的空值null,.NET Framework中數據庫字段的空值DBNull,boolean類型的假值false等等。在JavaScript中也有很多種的"空值"和"假值",那麽它們都有什麽共同點和不同點呢?
Undefined類型只有一個值,即undefined。當聲明的變量還未被初始化時,變量的默認值為undefined。
Null類型也只有一個值,即null。null用來表示尚未存在的對象,常用來表示函數企圖返回一個不存在的對象。

其實標題裏面我已經列出了JavaScript中所有的"空值"和"假值",除了boolean值本身就是true和false這兩種情況外,其它數據類型的"空值"主要是undefined和defined這兩大類。這些空值的類型分別是:

typeof(undefined) == ‘undefined‘

typeof(null) == ‘object‘

typeof("") == ‘string‘

typeof(0) == ‘number‘

typeof(false) == ‘boolean‘

這五個值的共同點是,在if語句中做判斷,都會執行false分支。當然從廣義上來看,是說明這些數值都是其對應數據類型上的無效值或空值。還有這五個值作!運算,結果全為:true。

這幾個值中也有不同,其中undefined和null比較特殊,雖然null的類型是object,但是null不具有任何對象的特性,就是說我們並不能執行null.toString()、null.constructor等對象實例的默認調用。所以從這個意義上來說,null和undefined有最大的相似性。看看null == undefined的結果(true)也就更加能說明這點。不過相似歸相似,還是有區別的,就是和數字運算時,10 + null結果為:10;10 + undefined結果為:NaN。

另外""、0和false雖然在if語句表現為"假值",可它們都是有意義數據,只是被作為了"空值"或"假值",因為:"".toString(),(0).toString()和false.toString()都是合法的可執行表達式。

其實這5個值在上面所說的這些差異裏,並不太會給流程控制帶來太大的問題,那麽要區分它們什麽呢?需要註意區分的是這些值在轉換為String時的差異是比較大的,它們到String的轉換關系是:

String(undefined) -> "undefined"

String(null) -> "null"

String("") -> ""

String(0) -> "0"

String(false) -> "false"

Js 示例代碼

1. var oValue;
2. alert(oValue == undefined); //output "true"

這段代碼顯示為true,代表oVlaue的值即為undefined,因為我們沒有初始化它。
js 代碼

3. alert(null == document.getElementById(‘notExistElement‘));

當頁面上不存在id為"notExistElement"的DOM節點時,這段代碼顯示為"true",因為我們嘗試獲取一個不存在的對象。
js 代碼

4. alert(typeof undefined); //output "undefined"
5. alert(typeof null); //output "object"

第一行代碼很容易理解,undefined的類型為Undefined;第二行代碼卻讓人疑惑,為什麽null的類型又是Object了呢?其實這是JavaScript最初實現的一個錯誤,後來被ECMAScript沿用下來。在今天我們可以解釋為,null即是一個不存在的對象的占位符,但是在實際編碼時還是要註意這一特性。
js 代碼

6. alert(null == undefined); //output "true"

ECMAScript認為undefined是從null派生出來的,所以把它們定義為相等的。但是,如果在一些情況下,我們一定要區分這兩個值,那應該怎麽辦呢?可以使用下面的兩種方法。
js 代碼

7. alert(null === undefined); //output "false"
8. alert(typeof null == typeof undefined); //output "false"

使用typeof方法在前面已經講過,null與undefined的類型是不一樣的,所以輸出"false"。而===代表絕對等於,在這裏null === undefined輸出false。

區分JS的空值