JavaScript中的null和undefined,看上去非常像,在使用的時候很不容易區(qū)分,也很難分辨什么時候是null,什么時候是undefined,以及它們的真正含義,但實際上它們還是有很多區(qū)別的。
什么是null?
對于js中的null來說,有以下兩個特點:
- null表示這個變量的值是空的,是一個不存在的值
- null表示這個變量已經(jīng)被分配了值
一個簡單的例子:
let a = null;
console.log(a);
// null
什么是undefined?
undefined指的是已經(jīng)定義了一個變量,但是沒有給這個變量賦值,這個時候這個變量就是undefined。
比如:
let b;
console.log(b);
// undefined
當然,我們也可以手動的將undefined賦給一個變量:
let c = undefined;
console.log(c);
// undefined
如果我們想訪問對象里不存在的字段,同樣會得到undefined:
var d = {};
console.log(d.fake);
// undefined
null和undefined有什么共同點?
1. 都會被判斷為false
在JavaScript中,null和undefined都會被判斷為false,所有會被判斷為false的值一共有6個,分別是:
- false
- 0 (zero)
- "" (empty string)
- null
- undefined
- NaN (Not A Number)
其它所有的值在JavaScript中都會被判斷為true
2. 都是原始值
在JavaScript中,一共有6種原始值,null和undefined都屬于原始值。JavaScript的6個原始值分別為:
- Boolean
- Null
- Undefined
- Number
- String
- Symbol
其它所有的值都是對象(包括object、function、array等)
3. null == undefined
如果直接去 == 運算符去比較null和undefined的話,會得到true。
是因為在JavaScript中,== 運算符測試的相等性不是很嚴格,并且執(zhí)行了預(yù)類型強制轉(zhuǎn)換。這意味著我們將兩個值轉(zhuǎn)換為通用類型后進行比較。
如果使用帶類型的比較,即===,則null === undefined會得到false
實際使用差異
如果我們這樣定義一個函數(shù)(這個函數(shù)有一個參數(shù)str,如果調(diào)用該函數(shù)時沒有傳入值,則str有一個默認值'hi'):
let logHi = (str = 'hi') => {
console.log(str);
}
如果我們不傳參數(shù)直接調(diào)用方法,變量str會有一個默認值'hi',控制臺輸出'hi':
logHi();
// hi
如果傳入一個'bye',則str被賦值,并在控制臺輸出'bye':
logHi('bye');
// bye
如果我們分別傳入null和undefined呢?
logHi(undefined);
// hi
logHi(null);
// null
如果傳入undefined,函數(shù)會認為沒有傳入?yún)?shù),變量str會被賦予默認值;而如果傳入null,則函數(shù)認為傳入的值為null,并將null賦值給變量str。
null的類型是object?
有趣的是,我們使用typeof獲取null和undefined的類型時,會得到null是一個object。
let a = null;
let b;
console.log(typeof a);
// object
console.log(typeof b);
// undefined
在JavaScript最開始被創(chuàng)建時,使用typeof去判斷null的類型就會得到object。
很多人都認為這是最開始JavaScript實現(xiàn)上的一個錯誤。
總結(jié)
- null是一個已經(jīng)分配的值,代表特殊的含義(空,什么都沒有)
- undefined是指一個變量被聲明了但是沒有分配值,這個時候這個變量就是undefined
- null和undefined在JavaScript中都會被判斷為false
- null和undefined都是JavaScript里的原始值(但是typeof null是object)
- null !== undefined,但是,null == undefined