1. 程式人生 > 其它 >再探JS---typeof引發的思考

再探JS---typeof引發的思考

技術標籤:前端jsjavascript

typeof引發的思考

前情提要

因為要給20級科協成員講課,於是回過頭看紅寶書。看到typeof是發現了很多有意思的事情

typeof null 
// 返回 object
typeof undefined
// 返回 undefined

疑惑1

看到這,大家我們首先會疑惑,為什麼null返回的結果是個object型別

這可以從來兩個角度去解釋

  1. 從邏輯角度,null值表示一個空物件指標,也正是會返回object的原因

  2. 需要先了解一下JavaScript基本資料型別儲存規則

    大家都知道 “typeof null” 的 bug,它是在 JavaScript 的第一版就存在的。在這個版本中,值以 32 位的單位儲存,包括一個小型型別標記(1-3 位)和值的實際資料。型別標記儲存在單元的較低位上。一共有 5 種類型:

    000: object,表示這個資料是一個物件的引用。

    1: int,表示這個資料是一個 31 位的有符號整型。

    010: double,表示這個資料是一個雙精度浮點數的引用。

    100: string,表示這個資料是一個字串的引用。

    110: boolean,表示這個資料是一個布林值。

    恰巧,null的型別標記和物件型別相同,這也就是出現這樣結果的根本原因

實質上null 有屬於自己的型別 Null,而不屬於Object型別,其實,我們可以通過另一種方法獲取 null 的真實型別:

Object.prototype.toString.call(null) ; // [object Null]

疑惑2

既然null和undefined本質不一樣,那麼為什麼會出現null==undefined

返回true的現象呢

解釋1:

有文章對此進行了解釋,大致是下面的意思:undefined的布林值是false,null的布林值也是false,所以它們在比較時都轉化為了false,所以 undefined == null

但是他是錯誤的

解釋2:

可以從Javascript規範中找到答案:

規範中提到, 要比較相等性之前,不能將 null 和 undefined 轉換成其他任何值,並且規定null 和 undefined 是相等的。

null 和 undefined都代表著無效的值

說白了,就是個bug硬性規定,無需過分糾結,日後避免使用即可,推薦使用不含type conversiontriple equals operator