這世界上之所以會有無主的東西,方法是因為有人失去了記憶。
——王小波《萬壽寺》
本文為讀 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)
最後,所有文章都會同步傳送到微信公眾號上,歡迎關注,歡迎提意見:
作者:對角另一面