說明:此類博客來自以下鏈接,對原內容做了標注重點知識,此處僅供自己學習參考!
來源:https://wangdoc.com/javascript/basic/introduction.html
1.null 和 undefined
1.1 概述
null
與undefined
都可以表示“沒有”,含義非常相似。將一個變量賦值為undefined
或null
,老實說,語法效果幾乎沒區別。
var a = undefined; // 或者 var a = null;
上面代碼中,變量a
分別被賦值為undefined
和null
,這兩種寫法的效果幾乎等價。
在if
語句中,它們都會被自動轉為false
,相等運算符(==
)甚至直接報告兩者相等。
if (!undefined) { console.log('undefined is false'); } // undefined is false if (!null) { console.log('null is false'); } // null is false undefined == null // true
從上面代碼可見,兩者的行為是何等相似!谷歌公司開發的 JavaScript 語言的替代品 Dart 語言,就明確規定只有null
,沒有undefined
!
既然含義與用法都差不多,為什么要同時設置兩個這樣的值,這不是無端增加復雜度,令初學者困擾嗎?這與歷史原因有關。
1995年 JavaScript 誕生時,最初像 Java 一樣,只設置了null
表示"無"。根據 C 語言的傳統,null
可以自動轉為0
。
Number(null) // 0 5 + null // 5
上面代碼中,null
轉為數字時,自動變成0。
但是,JavaScript 的設計者 Brendan Eich,覺得這樣做還不夠。首先,第一版的 JavaScript 里面,null
就像在 Java 里一樣,被當成一個對象,Brendan Eich 覺得表示“無”的值最好不是對象。其次,那時的 JavaScript 不包括錯誤處理機制,Brendan Eich 覺得,如果null
自動轉為0,很不容易發現錯誤。
因此,他又設計了一個undefined
。區別是這樣的:null
是一個表示“空”的對象,轉為數值時為0
;undefined
是一個表示"此處無定義"的原始值,轉為數值時為NaN
。
Number(undefined) // NaN 5 + undefined // NaN
*:NaN 屬性是代表非數字值的特殊值。該屬性用於指示某個值不是數字。可以把 Number 對象設置為該值,來指示其不是數字值。
1.2 用法和含義
對於null
和undefined
,大致可以像下面這樣理解。
null
表示空值,即該處的值現在為空。調用函數時,某個參數未設置任何值,這時就可以傳入null
,表示該參數為空。比如,某個函數接受引擎拋出的錯誤作為參數,如果運行過程中未出錯,那么這個參數就會傳入null
,表示未發生錯誤。
undefined
表示“未定義”,下面是返回undefined
的典型場景。
// 變量聲明了,但沒有賦值 var i; i // undefined // 調用函數時,應該提供的參數沒有提供,該參數等於 undefined function f(x) { return x; } f() // undefined // 對象沒有賦值的屬性 var o = new Object(); o.p // undefined // 函數沒有返回值時,默認返回 undefined function f() {} f() // undefined
2. 布爾值
布爾值代表“真”和“假”兩個狀態。“真”用關鍵字true
表示,“假”用關鍵字false
表示。布爾值只有這兩個值。
下列運算符會返回布爾值:
- 前置邏輯運算符:
!
(Not) - 相等運算符:
===
,!==
,==
,!=
- 比較運算符:
>
,>=
,<
,<=
如果 JavaScript 預期某個位置應該是布爾值,會將該位置上現有的值自動轉為布爾值。轉換規則是除了下面六個值被轉為false
,其他值都視為true
。
undefined
null
false
0
NaN
""
或''
(空字符串)
布爾值往往用於程序流程的控制,請看一個例子。
if ('') { console.log('true'); } // 沒有任何輸出
上面代碼中,if
命令后面的判斷條件,預期應該是一個布爾值,所以 JavaScript 自動將空字符串,轉為布爾值false
,導致程序不會進入代碼塊,所以沒有任何輸出。
注意,空數組([]
)和空對象({}
)對應的布爾值,都是true
。
if ([]) { console.log('true'); } // true if ({}) { console.log('true'); } // true
更多關於數據類型轉換的介紹,參見《數據類型轉換》一章。
3. 參考鏈接
- Axel Rauschmayer, Categorizing values in JavaScript