2012-03-09 100 views
16

reduce()方法的大多數用例都可以用for循環輕鬆地重寫。並且對JSPerf進行測試表明,reduce()通常慢60%-75%,具體取決於每次迭代內執行的操作。使用javascript Array reduce()方法有什麼實際好處嗎?

是否有任何真正的理由使用reduce(),然後,除了能夠在'功能風格'編寫代碼?如果通過編寫更多代碼可以獲得60%的性能提升,爲什麼要使用reduce()?編輯:事實上,像forEach()和map()等其他函數方法都顯示類似的性能,至少比簡單的循環慢60%。

這裏給JSPerf測試的鏈接(與函數調用):forloop vs forEach

回答

5
  • 你可能想作用域。例如,您可能想要製作回調函數或引用javascript對象。有關更多信息,請參閱爲什麼javascript不被限制範圍。 [編輯:現代javascript現在支持let變量。在ESv6之前,當你聲明一個var變量時,它被掛起,就好像它被寫在函數代碼塊的頂部一樣,所以你必須經常寫for循環體作爲函數。以下內容仍然適用於:]如果您已經編寫了函數,不妨使用函數式,除非它是一個重要的瓶頸。
  • 您的代碼並不總是需要以全機速度運行。您甚至可能無法優化瓶頸中的代碼。
  • 此外,你不提供你的「JSPerf測試」,所以我們可以批評它。例如,如果你已經有一個縮小函數(或者map或forEach函數),那麼我敢打賭,這個性能會是平均值。即使沒有,測試方法也可能有缺陷,尤其是考慮到許多瀏覽器可能會有不同的優化或者有不同的功能調用開銷。

旁註:這是語法之間的有效的性能比較,但在語法不是眼下的問題的無效的性能比較

myArray.map(function(x){return x+1}) 

// ...versus... 

for(var i=0; i<myArray.length; i++) { 
    myArray[i] = myArray[i]+1; 
} 

這將是一個有效的性能對比:

myArray.forEach(function(x){return x+1}) 

// ...versus... 

var plusOne = function(x){return x+1}; 
for(var i=0; i<myArray.length; i++) { 
    plusOne(myArray[i]); 
} 

// (may need a side-effect if the compiler is smart enough to optimize this) 

(另外,在回答您的編輯:.forEach().map()提供更加清晰,避免需要對於明確的循環int i=0; i<array.length; i++參數。)

+2

我不同意您構成有效性能比較的內容。 _first_是有效的比較,因爲肯定(對於你的例子)問題是「哪種方法最快加入數組的每一個元素?」,而不是「哪種方法最快,但任何不使用函數調用的方法都不合格從入門「。我會同意,如果你假設你想要一個函數來進行作用域/關閉目的,那麼你可以使用'.reduce()'或'.forEach()'或其他。 – nnnnnn 2012-03-09 06:57:54

+0

問題與語法完全相同,因此它是一個有效的性能比較。也許我應該在一個想要榨取每一點可能的表現的場景中重新提出這個問題。在這種情況下,我找不到一個不使用普通循環的好理由。你能提供一個絕對需要確定範圍的具體例子嗎? – 2012-03-14 01:17:42

+0

@EvanYou:'[1,2,3]。forEach(function(x){setTimeout(function(){alert(x)},1000)})'(alerts 1,2,3)vs'for(var i = 0; i <4; i ++){setTimeout function(){alert(i)},1000)}'(alerts 4,4,4) – ninjagecko 2012-03-14 02:13:03

相關問題