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

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
  }
  // ...
}


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

最佳答案

对于要测试的大量选项,两个操作将具有相同的计算复杂度-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
  }
  // ...
}


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

关于javascript - 链接逻辑运算符与Array.prototype.indexOf之间的性能区别是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56679969/

10-13 05:27