测试一系列项目的最佳方法

时间:2015-07-07 13:04:02

标签: javascript arrays optimization

我正在寻找一个简单模式的建议。也就是说,针对某些测试检查一系列事情。需要工作IE8 +

通常,我会做一些简单的事情,这似乎适合小型测试(即< 3项):

if (someTest === 'one' || someTest === 'two' || someTest === 'three' ) {
  // do something
}

但最近我一直在考虑其他方法来做同样的事情:

var arrayOfSomething= ['one', 'two', 'three', 'four'];
var arrayLength = arrayOfSomething.length;
for (var i = 0; i < arrayLength; i++) {
  if ( someTest === arrayOfSomething[i]) {
    // do something
  }
}

第一种方法似乎更具可读性,实际上需要更少的代码(假设列表很小)并且不需要两个额外的变量。第二种方法更有效,冗余更少,但也更复杂,可读性更低。

我是否过度思考这个?有最佳方​​法吗?

3 个答案:

答案 0 :(得分:1)

IE8不支持indexOf

要跨浏览器,请使用https://api.jquery.com/jQuery.inArray/

if ($.inArray(someTest,arrayOfSomething) > -1) {
    // do something
}

修改

来自JQuery源代码:

inArray: function( elem, arr, i ) {
    var len;

    if ( arr ) {
        if ( indexOf ) {
            return indexOf.call( arr, elem, i );
        }

        len = arr.length;
        i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;

        for ( ; i < len; i++ ) {
            // Skip accessing in sparse arrays
            if ( i in arr && arr[ i ] === elem ) {
                return i;
            }
        }
    }

    return -1;
},

答案 1 :(得分:0)

据我所知,对Javascript的布尔评估是懒惰的,这意味着一个布尔表达式在其结果已知时就会结束评估。

这意味着javascript引擎无法评估整个表达式

if (someTest === 'one' || someTest === 'two' || someTest === 'three' ) {
  // do something
}

如果someTest === 'one'它将停止评估并执行if子句。

但是,我个人更喜欢

之类的东西
var myTestValues = ['one', 'two', 'three'];
if (myTextValues.indexOf(someTest) != -1) {
    //do something
}

答案 2 :(得分:0)

在某些情况下这很有效:

switch (someTest) {
  case 'one':
  case 'two':
  case 'three':
    // do something
}

短路行为与原始片段相同。有些人可能会说这更具可读性。如果有多个组,它也会更好。