链接逻辑运算符与Array.prototype.indexOf之间的性能区别是什么

时间:2019-06-20 06:12:18

标签: javascript

最近,我遇到一种情况,如果变量的值是少数几个值之一,则必须做些事情。我最初使用链接逻辑运算符,如下所示:

function myFunction(value) {
  // ...
  if (value == 'one' || value == 'two') {
    // do something situationally
  }
  // ...
}

随着检查的增加,我用数组的indexOf调用替换了链式逻辑运算符,以检查它是否存在于该数组中,如下所示:

var checkArray = ['one', 'two', 'three'];
function myFunction(value) {
  // ...
  if (checkArray.indexOf(value) > -1) {
    // do something situationally
  }
  // ...
}

我想知道这两种情况之间是否存在性能差异。由于我仍然可以管理链式逻辑运算符,因此如果它们的运行速度明显更快,我可以切换回它们。

2 个答案:

答案 0 :(得分:4)

对于要测试的大量选项,两个操作将具有相同的计算复杂度-O(N)。需要循环检查每个可能的选项(用||内联,或在选中indexOf的数组中检查)。

如果您想要O(1)的计算复杂度,并且有很多 个要测试的选项,请改用Set-Set.has有很多项目要检查时速度更快:

const sitautionalValuesSet = new Set(['one', 'two', 'three']);
function myFunction(value) {
  // ...
  if (sitautionalValuesSet.has(value)) {
    // do something situationally
  }
  // ...
}

(这就是说,正如评论所指出的那样,要对其进行优化是一件奇怪的事情-除非这段特定的代码实际上占用了大量资源(可能不是),否则很可能存在更好的区域关注-运行性能测试,并识别并修复发现的瓶颈)

答案 1 :(得分:1)

没有区别,但是最好使用indexOf处理大量数据。

function myFunction1(value) {
  console.time('chaining');
  if (value == 'one' || value == 'two') {
    // do something situationally
    console.timeEnd('chaining');
  }
  // ...
}
myFunction1('one');


function myFunction2(value) {
  console.time('indexOf');
  var checkArray = ['one', 'two', 'three'];
  if (checkArray.indexOf(value) > -1) {
    // do something situationally
    console.timeEnd('indexOf');
  }
  // ...
}

myFunction2('one');

JFI:includesindexOf快,您可以看到测试jsperf