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

Javascript 测试一系列项目的最佳方法,javascript,arrays,optimization,Javascript,Arrays,Optimization,我在寻找一些简单模式的建议。也就是说,根据一些测试检查一系列内容。需要使用IE8+ 通常,我会做一些简单的事情,这似乎适合于小型测试(即

我在寻找一些简单模式的建议。也就是说,根据一些测试检查一系列内容。需要使用IE8+

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

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

var arrayOfSomething= ['one', 'two', 'three', 'four'];
var arrayLength = arrayOfSomething.length;
for (var i = 0; i < arrayLength; i++) {
  if ( someTest === arrayOfSomething[i]) {
    // do something
  }
}
var arrayOfSomething=['1','2','3','4'];
var arrayLength=arrayOfSomething.length;
对于(变量i=0;i
第一种方法看起来更具可读性,实际上需要更少的代码(假设列表很小),并且不需要两个额外的变量。第二种方法效率更高,冗余更少,但也更复杂,可读性更低


我是不是想得太多了?有最佳方法吗?

据我所知,Javascript上的布尔计算是惰性的,这意味着布尔表达式在其结果已知后立即结束计算

这意味着javascript引擎不会计算整个表达式

if (someTest === 'one' || someTest === 'two' || someTest === 'three' ) {
  // do something
}
If
someTest=='one'
它将停止计算并执行If子句

然而,我个人更喜欢这样的东西

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

IE8不支持
indexOf

要跨浏览器访问,请使用

编辑

来自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;
},
inArray:函数(元素、arr、i){
瓦伦;
如果(arr){
if(indexOf){
返回调用索引(arr,elem,i);
}
len=arr.长度;
i=i?i<0?数学最大值(0,len+i):i:0;
对于(;i
这在某些情况下效果良好:

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

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

Second可以写入
if(arrayOfSomething.indexOf(someTest)>=0)
现在已经足够简单了。Second更好,也不太复杂。注意,您的第二个代码段与第一个代码段不同。@fuyushimoya IE8不支持
indexOf
只是提醒那些对
indexOf
支持感到困惑的人,IE8不支持数组的
indexOf
,但支持字符串。我更喜欢普通的JS解决方案。@skube-So,查看JQuery inArray源代码以获得优化的代码。这非常有趣,似乎是一种理想的方法和解决方案。我唯一的犹豫是没有完全理解模式。它的优化程度似乎超出了我的能力。而且,似乎不容易阅读(至少对我来说)。不过,这可能是一个需要努力实现的目标。@skube总之,如果可以,请使用indexOf,否则请使用您的解决方案。这很有趣,但我认为@sdespont是正确的,
index.Of
在IE8上不受支持,这对我来说确实是个新闻。@skube这是正确的。indexOf是这种情况下的理想解决方案。对于IE8,只需包含条件。
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;
},
switch (someTest) {
  case 'one':
  case 'two':
  case 'three':
    // do something
}