2016-08-17 21 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指令/操作码,使用的优化)的引用的答案都只是一种推测。

相关问题