[TOC] #### 1. 前言 --- null 和 undefined 的區(qū)別 ?這是一道基礎(chǔ)面試題 很多人都會說 null 是空,undefined 是未定義,這樣回答太過于籠統(tǒng)。 面試官反問:null 是空代表沒有值是吧,undefined 是未定義也是沒有值是吧,都是沒有值,它們的區(qū)別到底是什么 ? 應(yīng)聘者:這下芭比Q了 ! #### 2. 歷史原因 --- JavaScript 語言居然有兩個表示 “無” 的值:null、undefined,這是為什么 ? 1995 年 JS 誕生時,最初像 Java 一樣,只設(shè)置了 null 作為表示 “無”,根據(jù) C 語言的傳統(tǒng),null 被設(shè)計成可以自動轉(zhuǎn)為 0 但是,JS 的設(shè)計者,覺得這樣做還不夠,主要有下面兩個原因 一、JS 中的 null 像 Java 中的 null 一樣,被當作一個對象。但是 JS 中的數(shù)據(jù)類型分為 **原始類型 和 合成類型(復(fù)合類型)**,作者覺得表示 “無” 的值最好不是對象,也可以理解為不應(yīng)該是對象 ```javascript // 返回值是 object typeof null ``` 二、JS 的最初版本沒有錯誤處理機制,發(fā)生數(shù)據(jù)類型不匹配時,會自動進行類型轉(zhuǎn)換,作者覺得,如果 null 自動轉(zhuǎn)為 0,很不容易發(fā)現(xiàn)錯誤 ```javascript // 2 null + 2 // NaN undefined + 2 ``` 因此,作者又設(shè)計了一個 undefined。先有 null 后有 undefined,出來 undefined 是為填充之前的坑 #### 3. 具體區(qū)別 --- **a. 自動轉(zhuǎn)換** JS 最初版本是這樣區(qū)分的: null 表示一個 “無” 的對象(空對象指針),轉(zhuǎn)為數(shù)值時是 0,undefined 表示一個 “無” 的原始值,轉(zhuǎn)為數(shù)值時是 NaN **b. 含義不同** null 的含義是空對象。一般用于賦值給那些可能返回對象的變量作為初始化值。typeof null 的返回值是 object undefined 的含義是未定義。變量聲明了但沒有賦值,變量的值是 undefined。typeof undefined 的返回值是 undefined