2014-12-02 106 views
1

我剛剛看到道格拉斯克羅克福德的新視頻,他說他不再使用循環。相反,他使用.forEach和.map等來遍歷數組。但我不明白爲什麼會更好。爲什麼我應該使用.forEach語法而不是for循環語法?

我知道for循環語法有點長,但不是馬上清楚你在做什麼(即使我認爲,如果你不知道語言)。那麼爲什麼這更好?

的視頻可以在這裏找到:http://youtu.be/bo36MrBfTk4?t=21m30s

+0

我認爲for循環沒有什麼問題,但是整個軟件行業在功能編程方面存在更廣泛的趨勢。我認爲這個功能非常強大,並且儘可能地切換到功能模式。好消息是Javascript已經提供了函數式編程的許多方面,而像Java這樣的語言現在不得不進行翻新。 – 2014-12-02 11:51:37

+0

在foreach中,您不需要知道數組的長度,並且您可以立即訪問當前的數組元素。 – Justinas 2014-12-02 11:51:41

回答

1

兩種方法總是更好,它取決於具體情況,也可能取決於您感覺舒適的方面。

其中之一,當使用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); 
} 

這種方法適合對功能效果更好(例如使用mapfilter生成一個新的集合),使用forEach沒有那個確切的好處。

函數方法的缺點是回調函數獲取自己的上下文。如果您在方法中使用它,你需要綁定的回調函數,以獲得正確的上下文:

var added = arr.map(function(e){ 
    return e + this.change; 
}.bind(this)); 

總之,經常的情況是不是這樣簡單的例子更加複雜。然後,無論您選擇哪種方法,都不會對性能或可讀性產生太大影響。

0

從本質上說,你是正確的,引擎蓋下.MAP和.forEach可能會使用一個for循環自己。真的,這歸結於偏好。

在我看來,使用.map,.reduce,.forEach可以創建更清晰的代碼。當我來看你的代碼時,一個for不會馬上告訴我你的意圖是什麼,除了你正在做的事情之外,我必須閱讀代碼來確定你的意圖。

當我遇到上面列出的功能之一時,我確切知道你的意圖是什麼。例如,如果我遇到.map,我知道您正在對您的集合中的每個項目應用操作。

老實說,我不使用任何這些,因爲我傾向於使用underscorejs來處理列表操作操作。

0

迭代函數更清晰。每種方法都有自己的用例。雖然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。如果您正在運行的服務的訪問量非常大,則性能差異很大,因爲迭代函數會產生大量的函數調用。