JavaScript中null和undefined詳解

一. 使用場景

  1. 在非嚴格場景下, 二者值是相等的
let a = null;
let b = undefined;
console.log(a == b) // true
console.log(a === b) // false
複製代碼
  1. 在條件判斷表達式中,二者做用也是相等的
if (null) {
    console.log('null', null)
} else {
    console.log('!null', !null) // 此項會輸出 !null true
}
if (undefined) {
    console.log('undefined', undefined)
} else {
    console.log('!undefined', !undefined) // 此項會輸出 !undefined true
}
複製代碼
  1. 對null和undefind進行數值類型強制類型轉換
console.log(Number(null));    // 0
console.log(Number(undefined)); // NaN 
複製代碼

爲什麼二者獲得的結果不同呢?很顯然,二者是徹底不一樣的兩種類型javascript

console.log(typeof null) // object
console.log(typeof undefined) // undefined
複製代碼

能夠看到null 是Object類型,undefined 是Undefined類型,看到這裏我不由有了一個疑問,若是null是引用數據類型,那麼我在MDN上看到的null則是基本數據類型,是MDN寫錯了?java

  答案應該沒有這麼簡單。 引用「在 javascript 的最第一版本中,使用的 32 位系統,而且底層都表示爲2進制,爲了性能考慮使用低位存儲了變量的類型信息:000:對象1:整數010:浮點數100:字符串110:布爾所有爲0: null,因此typeof就是利用這一機制去判斷的,因此null所有爲0就複合了對象的000,因此被判斷爲objectbash

因此使用typeof判斷變量類型的方式並不許確。post

console.log(Object.prototype.toString.call(null))  // [object Null]
console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
複製代碼

因此null依然是基本數據類型Null, undefined也是基本數據類型Undefined性能

二. 那麼JS爲什麼會有兩個使人困惑的類型呢?

  首先咱們須要先了解一個null值是什麼?MDN上是這樣描述的:In computer science, a null value represents a reference that points, generally intentionally, to a nonexistent or invalid object or address. The meaning of a null reference varies among language implementations. 翻譯過來就是: 在計算機科學中,一個null值表明一個指針的引用,一般來指一個不存在的或者無效的對象或者地址。空引用的含義因語言實現而異。
  在1995年JavaScript誕生的時候,只設置了null值,並被設計爲能夠自動轉爲0。null表示爲空對象的引用,因爲JavaScript數據類型分爲基本數據類型和引用數據類型,因此JavaScript的設計者Brendan Eich認爲最好不要用null表示基本數據類型變量未初始化時的值,因此後來又定義了undefined來表示基本數據類型未初始化時的值。ui

相關文章
相關標籤/搜索