這世界上之因此會有無主的東西,方法是由於有人失去了記憶。javascript
——王小波《萬壽寺》php
本文爲讀 lodash 源碼的第二十篇,後續文章會更新到這個倉庫中,歡迎 star:pocket-lodashhtml
gitbook也會同步倉庫的更新,gitbook地址:pocket-lodashjava
isObjectLike
的源碼很短,以下:git
function isObjectLike(value) {
return typeof value == 'object' && value !== null
}
複製代碼
其實就是使用 typeof
操做符,若是返回值爲 object
,而且值又不爲 null
時,就認爲是類對象。github
這裏須要簡單地說一下 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
上的解釋:ecmascript
在 JavaScript 最初的實現中,JavaScript 中的值是由一個表示類型的標籤和實際數據值表示的。對象的類型標籤是 0。因爲
null
表明的是空指針(大多數平臺下值爲 0x00),所以,null的類型標籤也成爲了 0,typeof null
就錯誤的返回了"object"
。(reference)函數ECMAScript提出了一個修復(經過opt-in),但被拒絕。這將致使typeof null === 'object'。源碼分析
另外還有一點須要注意的,在由宿主實現的對象中,規範規定了不能返回 'undefined'
, 'boolean'
, 'number'
和 'string'
這幾種類型,可是 document.all
例外,返回的是 'undefined'
,這是不遵循規範的實現。
署名-非商業性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)
最後,全部文章都會同步發送到微信公衆號上,歡迎關注,歡迎提意見:
做者:對角另外一面