lodash原始碼分析之isObjectLike

对角另一面發表於2018-10-02

這世界上之所以會有無主的東西,方法是因為有人失去了記憶。

——王小波《萬壽寺》

本文為讀 lodash 原始碼的第二十篇,後續文章會更新到這個倉庫中,歡迎 star:pocket-lodash

gitbook也會同步倉庫的更新,gitbook地址:pocket-lodash

原始碼分析

isObjectLike 的原始碼很短,如下:

function isObjectLike(value) {
  return typeof value == 'object' && value !== null
}
複製程式碼

其實就是使用 typeof 操作符,如果返回值為 object ,並且值又不為 null 時,就認為是類物件。

這裡需要簡單地說一下 typeof 操作符,typeof 會遵循下面的規則來返回:

型別 結果
Undefined 'undefined'
Null 'object'
Boolean 'boolean'
Number 'number'
String 'string'
Symbol 'symbol'
宿主物件 由宿主實現,但是不能為 'undefined', 'boolean', 'number''string'
函式物件 'function'
任意其它物件 'object'

這裡需要說一下的是 null ,也是 isObjectLike 的關鍵所在,使用 typeof 的操作符時,null 會返回 object ,為什麼會這樣呢,看 MDN 上的解釋:

在 JavaScript 最初的實現中,JavaScript 中的值是由一個表示型別的標籤和實際資料值表示的。物件的型別標籤是 0。由於 null 代表的是空指標(大多數平臺下值為 0x00),因此,null的型別標籤也成為了 0,typeof null就錯誤的返回了"object"。(reference

ECMAScript提出了一個修復(通過opt-in),但被拒絕。這將導致typeof null === 'object'。

另外還有一點需要注意的,在由宿主實現的物件中,規範規定了不能返回 'undefined', 'boolean', 'number''string' 這幾種型別,但是 document.all 例外,返回的是 'undefined' ,這是不遵循規範的實現。

參考

License

署名-非商業性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)

最後,所有文章都會同步傳送到微信公眾號上,歡迎關注,歡迎提意見:

lodash原始碼分析之isObjectLike

作者:對角另一面

相關文章