再探JS---typeof引發的思考
技術標籤:前端jsjavascript
typeof引發的思考
前情提要
因為要給20級科協成員講課,於是回過頭看紅寶書。看到typeof是發現了很多有意思的事情
typeof null
// 返回 object
typeof undefined
// 返回 undefined
疑惑1
看到這,大家我們首先會疑惑,為什麼null返回的結果是個object型別
這可以從來兩個角度去解釋
-
從邏輯角度,null值表示一個空物件指標,也正是會返回object的原因
-
需要先了解一下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 conversion
的triple equals operator