最近,我遇到一种情况,如果变量的值是少数几个值之一,则必须做些事情。我最初使用链接逻辑运算符,如下所示:
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
}
// ...
}
我想知道这两种情况之间是否存在性能差异。由于我仍然可以管理链式逻辑运算符,因此如果它们的运行速度明显更快,我可以切换回它们。
答案 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:includes
比indexOf
快,您可以看到测试jsperf