JavaScript中的null和undefined

JavaScript中的null和undefined,看上去非常像,在使用的時候很不容易區(qū)分,也很難分辨什么時候是null,什么時候是undefined,以及它們的真正含義,但實際上它們還是有很多區(qū)別的。

什么是null?

對于js中的null來說,有以下兩個特點:

  1. null表示這個變量的值是空的,是一個不存在的值
  2. 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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容