underscore 原始碼閱讀 四

2021-09-28 20:05:42 字數 1409 閱讀 4021

_.keys();

=> ["one", "two", "three"]

檢索object擁有的所有可列舉屬性的名稱。

我們知道,在js中本就提供了幾個方法如for...in...object.keys來遍歷物件的屬性,為什麼underscore還是要封裝乙個api呢?

這其實是為相容ie9版本下的乙個bug做的封裝:

在ie9以下的版本中,以下**不會列印任何東西,而我們的期望是列印tostring:1,所以underscore針對這個問題做了相容處理。因為在ie9以下,自定義的tostring預設是不可遍歷的,與現代瀏覽器相反。

var cc = object.create({})

cc.tostring = 1

for(var key in cc)

可以用以下**來檢測:

.propertyisenumerable('tostring')

如果返回的有值則說明自定義tostring是遍歷的,不存在bug,反之,則處理它。

underscore中定義了乙個不可被ie9以下遍歷的屬性陣列:

nonenumerableprops

valueof

isprototypeof

tostring

propertyisenumerable

hasownproperty

tolocalestring

在undersocre中有乙個函式collectnonenumprops來完成這件事,那麼它是怎麼做的,我們具體分析下這段簡短的**:

var

collectnonenumprops

=function

(obj, keys)

}}

其中,重點在於obj[prop] !== proto[prop]這個判斷,當前的prop屬性是否等於原型鏈上的屬性,如果等於則不做處理,不等於代表prop是自定義屬性並將其收集到keys中。

api區別

allkeys

檢索object擁有的和繼承的所有屬性的名稱。

keys

檢索object擁有的所有可列舉屬性的名稱,通過hasownpropertie判斷

underscore原始碼閱讀整理

underscore是我閱讀的第乙份原始碼,這份 比較小巧,只有1500行,我閱讀的版本是1.8.3.underscore裡封裝了很多功能性的函式,和jquery不同,我覺得jquery的特點是對針對dom,而underscore裡都是基於js的功能性函式,比如each,map等等。以下內容僅是我閱...

Underscore原始碼閱讀極簡版入門

看了網上的一些資料,發現大家都寫得太複雜,讓新手難以入門。於是寫了這個極簡版的underscore原始碼閱讀。原始碼 1.1 架構 function this.call this 1.2 引入exports判斷,如果不支援exports則繼續使用this function if typeof exp...

underscore原始碼分析 1

underscore 版本1.83 最主要的乙個特性是鏈式呼叫 1,2,3 each console.log 1 0 3 1,2,3 2 1 3 1,2,3 3 2 3 1,2,3 我們先簡單的實現鏈式呼叫的功能 實現 each 1,2,3 console.log 是很簡單的 直接 each函式就搞...