null 和undefined都是JavaScript裏的簡單數據類型,平時很容易弄混他倆的用法與區別。通常靜態類型語言裏都只有一個來表示「空」的類型,好比java裏的null,那爲何JavaScript裏有兩個呢?javascript
在設計JavaScript之初,就只有null來表明空,null能夠經過Number()轉換成0。可是設計者以爲一個不夠。緣由以下:java
1. null被當成一個對象,在JavaScript中,有原始類型和合成類型兩大類,設計者以爲用對象來表示空很差。bash
2. JavaScript設計之初沒有錯誤處理機制,若是數據類型不匹配,要麼自動轉換類型,要麼就默默失敗,null會自動轉換成0,這樣很不容易發現錯誤。函數
因此,undefined誕生了。ui
if (!undefined)
console.log('undefined is false');
// undefined is false
if (!null)
console.log('null is false');
// null is false
undefined == null
// true複製代碼
parseInt(null)
NaN
parseInt(undefined)
NaN複製代碼
最初的時候區分是這樣的: null表示一個無的對象,轉換爲數值時是0, undefined表示無的原始值,轉成數值是NaN.spa
可是實際用的時候,發現不行啊 ,他倆太像了。prototype
null表示沒有對象,此處不應有值。設計
常常用在: code
①表示函數的參數,表明此參數不是對象 對象
② 做爲對象原始鏈的終點。
Object.getPrototypeOf(Object.prototype)
// null複製代碼
undefined表示缺值,就是此處應該有值,可是沒定義。
常常用在:
①變量聲明瞭可是沒定義值;
②調用函數的時候,該傳的參數沒傳,此時參數就是undefined
③對象沒有賦值的屬性,該屬性值爲undefined;
④ 函數沒返回值時默認返回undefined
var i;
i // undefined
function f(x){console.log(x)}
f() // undefined
var o = new Object();
o.p // undefined
var x = f();
x // undefined
複製代碼