我正在寻找一个简单模式的建议。也就是说,针对某些测试检查一系列事情。需要工作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
}
}
第一种方法似乎更具可读性,实际上需要更少的代码(假设列表很小)并且不需要两个额外的变量。第二种方法更有效,冗余更少,但也更复杂,可读性更低。
我是否过度思考这个?有最佳方法吗?
答案 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
}
短路行为与原始片段相同。有些人可能会说这更具可读性。如果有多个组,它也会更好。