Breaking Bad(JavaScript 庫中的循環)
當我發現最流行的 JavaScript 庫在處理 each 和 forEach 循環的方式上存在不一致時,我感到有點驚訝。本帖對比:
- 原生 JavaScript 中的 forEach 循環
- Lo-Dash 中的每個循環
- jQuery 中的每個循環
- Underscore.js 中的每個循環
- Underscore.js 中的 forEach 循環
原生 JavaScript 中的 forEach 循環
JavaScript 庫很重要(例如,jQuery、Lo-Dash、Underscore),但在功能循環的情況下(forEach
和 each
)它們會造成很多混亂(for循環可以用'break'來打破)。讓我們看看 forEach
的原生 JavaScript 代碼示例 方法:
[1,2].forEach(function(v){
alert(v);
return false;
})
這將向我們顯示兩個警報框。在 JSFiddle 中自己嘗試原生 JavaScript 代碼。
這是大多數情況下的預期行為,因為每次迭代我們都會調用一個新函數。不同於 for (var i=0; i<arr.length; i++) {}
沒有函數/迭代器的代碼。
然而,在 Lo-Dash 和 jQuery 中,類似的代碼打破了循環!
打破 Lo-Dash 中的每個循環
each
的 Lo-Dash 代碼 只產生一個警報 :
_.each([1,2],function(v){
alert(v);
return false;
})
在 JSFiddle 中自己嘗試上面的 Lo-Dash 代碼。
在 jQuery 中打破每個循環
同樣,jQuery each
示例僅顯示第一個警報:
$.each([1,2],function(i, v){
alert(v);
return false;
})
在 JSFiddle 中自己嘗試 jQuery 代碼。
不中斷 Underscore.js 中的每個循環
更複雜的是,Underscore.js 和 Backbone.js 仍然忠實於原生 JavaScript 解釋。
Underscore.js each
遍歷每個項目並且不會中斷的示例 :
_.each([1,2],function(v){
alert(v);
return false;
})
試試下劃線 each
JSFiddle 中的方法。
Underscore.js 中的非中斷 forEach 循環
只是為了它,下劃線 forEach()
進行了測試。它可靠地產生了類似於原生 forEach()
的結果 :兩個警報!
下劃線 forEach()
代碼:
_.forEach([1,2],function(i, v){
alert(v);
return false;
})
試試 Underscrore.js forEach()
在 JSFiddle 自己編寫代碼。
[旁注]
閱讀博客文章很好,但觀看視頻課程更好,因為它們更具吸引力。
許多開發人員抱怨 Node.js 上缺乏負擔得起的高質量視頻材料。觀看 YouTube 視頻會讓人分心,花 500 美元購買 Node 視頻課程很瘋狂!
去看看 Node University,它有關於 Node 的免費視頻課程:node.university。
[旁注結束]
Lo-Dash 和 Underscore 之間的代碼破解區別
這篇簡短文章的結論是 Lo-Dash 不等於 Underscore , 除非正在使用特殊的下劃線兼容版本。 John-David Dalton (@jdalton) 親切地向我指出了這一點:
PS:Underscore.js forEach
比原生 forEach
更兼容瀏覽器 因為後者是後來添加到 JavaScript API 的,舊版瀏覽器不支持。