怎么能数组.indexOf比Array.some更有效

How can Array.indexOf be more efficient than Array.some

本文关键字:some 有效 Array 数组 indexOf 怎么能      更新时间:2023-09-26

这个问题的灵感来自这个问题的竞争答案:indexOf with multiple arguments

用户想知道一种有效的方法来测试数组中是否存在一个或多个给定的整数。具体来说,给定一个数组和数字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;
});

indexOf()some()的ECMA-262算法在找到成功匹配时都短路了,但我本以为some()在没有匹配时实现会更快。然而,另一位用户指出indexOf()解决方案更快。

indexOf()代码如何更有效,即使它必须在数组上迭代更多次?

问题是——你的问题高度依赖于标准本身,而不是标准如何实现。

表示,不同引擎之间的结果可能不一致。

在某些引擎中,有时"调用函数有开销"这一非常明显的假设可能会通过内联函数调用和其他一些棘手的优化来缓解。

总结:没有单一的正确答案,任何答案都不会使用任何引用ES实现+运行时细节(cpu指令/操作码,使用的优化)-只是一个猜测。