JavaScript中的null和undefined,看上去非常像落塑,在使用的時(shí)候很不容易區(qū)分弥奸,也很難分辨什么時(shí)候是null榨惠,什么時(shí)候是undefined,以及它們的真正含義盛霎,但實(shí)際上它們還是有很多區(qū)別的赠橙。
什么是null?
對(duì)于js中的null來說愤炸,有以下兩個(gè)特點(diǎn):
- null表示這個(gè)變量的值是空的期揪,是一個(gè)不存在的值
- null表示這個(gè)變量已經(jīng)被分配了值
一個(gè)簡(jiǎn)單的例子:
let a = null;
console.log(a);
// null
什么是undefined?
undefined指的是已經(jīng)定義了一個(gè)變量规个,但是沒有給這個(gè)變量賦值横侦,這個(gè)時(shí)候這個(gè)變量就是undefined。
比如:
let b;
console.log(b);
// undefined
當(dāng)然绰姻,我們也可以手動(dòng)的將undefined賦給一個(gè)變量:
let c = undefined;
console.log(c);
// undefined
如果我們想訪問對(duì)象里不存在的字段,同樣會(huì)得到undefined:
var d = {};
console.log(d.fake);
// undefined
null和undefined有什么共同點(diǎn)引瀑?
1. 都會(huì)被判斷為false
在JavaScript中狂芋,null和undefined都會(huì)被判斷為false,所有會(huì)被判斷為false的值一共有6個(gè)憨栽,分別是:
- false
- 0 (zero)
- "" (empty string)
- null
- undefined
- NaN (Not A Number)
其它所有的值在JavaScript中都會(huì)被判斷為true
2. 都是原始值
在JavaScript中帜矾,一共有6種原始值,null和undefined都屬于原始值屑柔。JavaScript的6個(gè)原始值分別為:
- Boolean
- Null
- Undefined
- Number
- String
- Symbol
其它所有的值都是對(duì)象(包括object屡萤、function、array等)
3. null == undefined
如果直接去 == 運(yùn)算符去比較null和undefined的話掸宛,會(huì)得到true死陆。
是因?yàn)樵贘avaScript中,== 運(yùn)算符測(cè)試的相等性不是很嚴(yán)格,并且執(zhí)行了預(yù)類型強(qiáng)制轉(zhuǎn)換措译。這意味著我們將兩個(gè)值轉(zhuǎn)換為通用類型后進(jìn)行比較别凤。
如果使用帶類型的比較,即===领虹,則null === undefined會(huì)得到false
實(shí)際使用差異
如果我們這樣定義一個(gè)函數(shù)(這個(gè)函數(shù)有一個(gè)參數(shù)str规哪,如果調(diào)用該函數(shù)時(shí)沒有傳入值,則str有一個(gè)默認(rèn)值'hi'):
let logHi = (str = 'hi') => {
console.log(str);
}
如果我們不傳參數(shù)直接調(diào)用方法,變量str會(huì)有一個(gè)默認(rèn)值'hi'塌衰,控制臺(tái)輸出'hi':
logHi();
// hi
如果傳入一個(gè)'bye'诉稍,則str被賦值,并在控制臺(tái)輸出'bye':
logHi('bye');
// bye
如果我們分別傳入null和undefined呢最疆?
logHi(undefined);
// hi
logHi(null);
// null
如果傳入undefined杯巨,函數(shù)會(huì)認(rèn)為沒有傳入?yún)?shù),變量str會(huì)被賦予默認(rèn)值肚菠;而如果傳入null舔箭,則函數(shù)認(rèn)為傳入的值為null,并將null賦值給變量str蚊逢。
null的類型是object层扶?
有趣的是,我們使用typeof獲取null和undefined的類型時(shí)烙荷,會(huì)得到null是一個(gè)object镜会。
let a = null;
let b;
console.log(typeof a);
// object
console.log(typeof b);
// undefined
在JavaScript最開始被創(chuàng)建時(shí),使用typeof去判斷null的類型就會(huì)得到object终抽。
很多人都認(rèn)為這是最開始JavaScript實(shí)現(xiàn)上的一個(gè)錯(cuò)誤戳表。
總結(jié)
- null是一個(gè)已經(jīng)分配的值,代表特殊的含義(空昼伴,什么都沒有)
- undefined是指一個(gè)變量被聲明了但是沒有分配值匾旭,這個(gè)時(shí)候這個(gè)變量就是undefined
- null和undefined在JavaScript中都會(huì)被判斷為false
- null和undefined都是JavaScript里的原始值(但是typeof null是object)
- null !== undefined,但是圃郊,null == undefined