javascript的null、undefined和布林資料型別
javascript中 有null、undefined 在使用typeof 時候
console.log(typeof null); //object
console.log(typeof undefined) //undefined
null
與undefined
都可以表示“沒有”,含義非常相似。將一個變數賦值為undefined
或null
,老實說,語法效果幾乎沒區別。
兩個型別到底有什麼區別,什麼場景使用是個頭疼的問題。
一、概述
//1.在if
語句中,它們都會被自動轉為false
,相等運算子(==
)甚至直接報告兩者相等。
var a = undefined; // 或者 var a = null; 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
Number(undefined) // NaN
5 + undefined // NaN
但是,JavaScript 的設計者 Brendan Eich,覺得這樣做還不夠。首先,第一版的 JavaScript 裡面,null
null
自動轉為0,很不容易發現錯誤。
因此,他又設計了一個undefined
。區別是這樣的:null
是一個表示“空”的物件,轉為數值時為0
;undefined
是一個表示"此處無定義"的原始值,轉為數值時為NaN
。
二、用法和含義
對於null
和undefined
,大致可以像下面這樣理解。
null 1.通過id獲取元素如果獲取不到內容,那麼預設返回值是null 2.如果要銷燬物件的堆記憶體,那麼就給物件賦值null 3.正則進行捕獲,捕獲不到內容,那麼返回值就是null; undefined 1.如果變數只宣告,沒有賦值,那麼預設儲存的值就是undefined; 2.如果獲取物件的屬性名和對應的屬性值,如果屬性名不存在,獲取的就是undefined 3.如果函式沒有物件的實參,那麼形參預設儲存的值就是undefined 4.如果函式沒有return,那麼預設的返回值也是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
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面我們在說一說布林資料型別(boolean)
布林型別
布林值代表“真”和“假”兩個狀態。“真”用關鍵字true
表示,“假”用關鍵字false
表示。布林值只有這兩個值。
下列運算子會返回布林值:
- 前置邏輯運算子:
!
(Not) - 相等運算子:
===
,!==
,==
,!=
- 比較運算子:
>
,>=
,<
,<=
關於布林型別的轉換是要說的重點,因為這確實不符合我們之前學習語言轉換的規律
如果 JavaScript 預期某個位置應該是布林值,會將該位置上現有的值自動轉為布林值。轉換規則是除了下面六個值被轉為false
,其他值都視為true
。
undefined
null
false
0
NaN
""
或''
(空字串)
總結:請記住只有以上6種情況會轉換為false
console.log(Boolean(0)); //false
console.log(Boolean(NaN)); //false
console.log(Boolean("")); //false
console.log(Boolean('')); //false
console.log(Boolean(" ")); //true
console.log(Boolean("0")); //true
console.log(Boolean(null)); //false
console.log(Boolean(undefined)); //false
console.log(Boolean([])); //true
console.log(Boolean({})) //true