1. 程式人生 > 實用技巧 >又結束了段繁忙期,來聊聊Null和Undefined吧

又結束了段繁忙期,來聊聊Null和Undefined吧

前言:

我們經常會遇到這兩位特殊的資料型別,比如查一個物件的屬性時,如果這個物件沒有這個屬性就會報undefined(原型鏈)。又比如我們可以將一個物件置為null,就可以釋放這個物件的引用,以便瀏覽器回收。那為什麼會出現這些情況呢,下面讓我們去了解下這兩種資料型別吧。

一、Undefined型別是什麼

Undefined型別只有一個值那就是undefined。在使用var來定義一個變數而未賦值時,這個變數的值就是undefined。(摘自Javascript高階程式設計)

讓我們來驗證下這句話。

var msg;
console.log(msg===undefined);

瀏覽器執行的結果自然是true。除了這種方法來證明它是undefined之外還有別的辦法嗎?當然還有,我們可以藉助typeof操作符。

var msg;
console.log(typeof msg);

返回的結果是’undefined‘。自然也可以幫助我們來識別。

我們經常會呼叫一個函式並傳入引數,如果傳的引數少於形引數量,多的形參其實值都為undefined。

function fun(a,b,c){
    console.log(a,b,c)
}
fun(2)

  很顯然,返回值為:2 undefinedundefined

這裡還需要跟大家分辨一個組合:定義卻未賦值,未定義。

定義卻未賦值,它的結果自然是我們上頭提到的undefined。

如果是未定義這個變數而呼叫這個變數呢?也會返回undefined嗎?並不然,它會報錯

二、Null型別是什麼呢?

  Null型別也只有一個值,那就是null。從邏輯角度上看,null代表一個空物件指標。(摘自Javascript高階程式設計)

  正因為它代表一個空物件指標,所以當我們用上面的typeof運算子去檢視一個null值的變數時,結果為’object‘。(擴充套件:typeof也不能區分Array型別和Object型別)。

  那我們可以用什麼來確定這個是null呢?可以用===或者新方法Object.prototype.toString.call(null)

var obj=null;
console.log(obj==null);
console.log(Object.prototype.toString.call(obj))

返回值依次為true和[object Null],以上就能判斷出是否為null值

說了這麼多,那我們什麼時候要用到null呢?

我認為有兩種情況可以用到null

1.初始賦值,表明將要賦值為物件
2.結束前,讓物件成為垃圾物件(被瀏覽器的垃圾回收器回收)

三、Undefined和Null有啥異同嗎?

1.注意點

Undefined是派生自Null值的,所以在ECMA-262規定對他們的相等性測試要返回true。

也就是null==undefined返回true。但是null===undefined返回的是false,所以在上文提到利用===來分別辨別null值和undefined值,而不是用==

2.不同點

a.沒有必要將一個變數初始化賦值為undefined(因為未賦值就會是undefined),但有必要將一個物件初始置為null。

b.呼叫Number函式轉化為數值時不一樣:undefined為NaN ,null為0。

以上便是我對二者的理解,歡迎補充!!