我剛剛看到道格拉斯克羅克福德的新視頻,他說他不再使用循環。相反,他使用.forEach和.map等來遍歷數組。但我不明白爲什麼會更好。爲什麼我應該使用.forEach語法而不是for循環語法?
我知道for循環語法有點長,但不是馬上清楚你在做什麼(即使我認爲,如果你不知道語言)。那麼爲什麼這更好?
的視頻可以在這裏找到:http://youtu.be/bo36MrBfTk4?t=21m30s
我剛剛看到道格拉斯克羅克福德的新視頻,他說他不再使用循環。相反,他使用.forEach和.map等來遍歷數組。但我不明白爲什麼會更好。爲什麼我應該使用.forEach語法而不是for循環語法?
我知道for循環語法有點長,但不是馬上清楚你在做什麼(即使我認爲,如果你不知道語言)。那麼爲什麼這更好?
的視頻可以在這裏找到:http://youtu.be/bo36MrBfTk4?t=21m30s
兩種方法總是更好,它取決於具體情況,也可能取決於您感覺舒適的方面。
其中之一,當使用map
代碼得到更清晰一點。你可以看到輸出作爲表達式的結果:
var added = arr.map(function(e){
return e + 1;
});
當使用for
迴路將輸出結束了它不是那麼明顯:
var added = [];
for (var i = 0; i < arr.length; i++) {
added.push(arr[i] + 1);
}
這種方法適合對功能效果更好(例如使用map
或filter
生成一個新的集合),使用forEach
沒有那個確切的好處。
函數方法的缺點是回調函數獲取自己的上下文。如果您在方法中使用它,你需要綁定的回調函數,以獲得正確的上下文:
var added = arr.map(function(e){
return e + this.change;
}.bind(this));
總之,經常的情況是不是這樣簡單的例子更加複雜。然後,無論您選擇哪種方法,都不會對性能或可讀性產生太大影響。
從本質上說,你是正確的,引擎蓋下.MAP和.forEach可能會使用一個for循環自己。真的,這歸結於偏好。
在我看來,使用.map,.reduce,.forEach可以創建更清晰的代碼。當我來看你的代碼時,一個for不會馬上告訴我你的意圖是什麼,除了你正在做的事情之外,我必須閱讀代碼來確定你的意圖。
當我遇到上面列出的功能之一時,我確切知道你的意圖是什麼。例如,如果我遇到.map,我知道您正在對您的集合中的每個項目應用操作。
老實說,我不使用任何這些,因爲我傾向於使用underscorejs來處理列表操作操作。
迭代函數更清晰。每種方法都有自己的用例。雖然for
循環不會告訴您它的目的,除非您仔細閱讀代碼。
迭代函數爲數組中的每個元素提供了一個單獨的閉包。在某些情況下它可以挽救你的生命。例如,我認爲大多數初學者都寫過這樣的代碼:
for(var i = 0; i < elements.length; i++) {
elements[i].onclick = function() {
alert(i);
}
}
通常情況並非如預期的那樣。
我們有一個函數閉包:
for(var i = 0; i < elements.length; i++) {
(function(i) {
elements[i].onclick = function() {
alert(i);
}
})(i);
}
在另一方面,有時for
循環不執行比迭代功能更好。是的,它是node.js。如果您正在運行的服務的訪問量非常大,則性能差異很大,因爲迭代函數會產生大量的函數調用。
我認爲for循環沒有什麼問題,但是整個軟件行業在功能編程方面存在更廣泛的趨勢。我認爲這個功能非常強大,並且儘可能地切換到功能模式。好消息是Javascript已經提供了函數式編程的許多方面,而像Java這樣的語言現在不得不進行翻新。 – 2014-12-02 11:51:37
在foreach中,您不需要知道數組的長度,並且您可以立即訪問當前的數組元素。 – Justinas 2014-12-02 11:51:41