2016-08-17 50 views
1

這個問題是來自於這個問題的答案,競爭激勵更有效:indexOf with multiple arguments如何Array.indexOf比Array.some

用戶想知道一個有效的方法來測試一個或多個存在的數組數組中給出的整數。具體來說,給定一個數組和數字123,124125,如何判斷給定數組中是否存在一個或多個這些整數。兩種解決方案被提出:

使用indexOf()

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
var exists = array.indexOf(123) !== -1 || array.indexOf(124) !== -1 || array.indexOf(125) !== -1; 

或者,使用some()

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
var exists = array.some(function(item) { 
    return item === 123 || item === 124 || item === 125; 
}); 

雙方找到成功的匹配時,ECMA-262算法indexOf()some()短路,但我會認爲當沒有匹配時,some()的實現會更快。但另一位用戶指出indexOf()解決方案is faster

indexOf()代碼是如何更有效的,即使它必須迭代數組多次?

+1

我會想象因爲'.indexOf'缺少調用函數的開銷。對於較大的陣列,「some」可能更有效。 – Blender

+3

'Array.prototype.indexOf'返回'-1',如果沒有找到元素,我會假設你的'=== 0'不是預期的,應該是'!== -1' – ASDFGerte

+1

使用不同的瀏覽器,並且多次運行測試,我得到了不同的結果。在Chrome 52上,test2速度更快。在Firefox 50上,test1更快。不太確定那麼一個比另一個快。 – noKid

回答

3

事情是 - 你的問題高度依賴標準本身,而不是標準如何實施。

表示說,結果可能在不同引擎之間不一致。

通過內聯函數調用和一些其他棘手的優化,可以緩解一些非常明顯的假設,即在某些引擎中「有開銷調用函數」。總結:沒有單一的正確答案,任何不會使用任何對ES實現+運行時細節(CPU指令/操作碼,使用的優化)的引用的答案都只是一種推測。

相關問題