又結束了段繁忙期,來聊聊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。
以上便是我對二者的理解,歡迎補充!!