_.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函式就搞...