lodash原始碼分析之isObjectLike
這世界上之所以會有無主的東西,方法是因為有人失去了記憶。
——王小波《萬壽寺》
本文為讀 lodash 原始碼的第二十篇,後續文章會更新到這個倉庫中,歡迎 star:ofollow,noindex">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'
,這是不遵循規範的實現。