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
可以自動轉為
。
Number(null) // 0
5 + null // 5
Number(undefined) // NaN
5 + undefined // NaN
但是,JavaScript 的設計者 Brendan Eich,覺得這樣做還不夠。首先,第一版的 JavaScript 裡面,
null
就像在 Java 裡一樣,被當成一個對象,Brendan Eich 覺得表示“無”的值最好不是對象。其次,那時的 JavaScript 不包括錯誤處理機制,Brendan Eich 覺得,如果
null
自動轉為0,很不容易發現錯誤。
是以,他又設計了一個
undefined
。差別是這樣的:
null
是一個表示“空”的對象,轉為數值時為
;
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
-
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