更好的使用带有OR的IF语句的方法

3

我有一个if语句,想知道是否存在更好的编写方法

if(i == "502" || i == "562" || i == "584" || i == "482" || i == "392"){
   //Some Stuff here
}

1
你得到的答案正在执行严格的相等比较。由于你正在进行==比较,这可能会改变结果。例如,如果i502而不是"502",你的结果将是true,而其他人的结果将是false - user2437417
然后尝试使用/^(?:502|562|584|482|392)$/.test(i),这将执行字符串强制转换。 :-) - Bergi
5个回答

5

那很好。你也可以使用Array.indexOf

if(['502', '562', '584', '482', '392'].indexOf(i) !== -1)
{
    /*Do Stuff*/
}

然而,使用Array.indexOf时需要小心,因为它在IE9之前的版本中不被支持 :(。这就是为什么人们经常建议使用$.inArray而不是Array.indexOf的原因。


在一些旧的浏览器(IE,我在看你...)中,原型数组没有indexOf()方法,因此您应该使用jQuery方法:$.inArray(),但我认为这是一个不错的方法。 - A. Wolff
感谢您指出这个问题。我正在修改我的帖子,以强调浏览器兼容性问题。 - Steven Wexler
@roasted:在他链接的页面上有一个兼容性部分可供阅读(包括一个简单的解决方案)- 没有必要一遍又一遍地重复这个 :-) - Bergi
@Bergi,您看到标记为“已编辑”的小链接了吗? ;) - A. Wolff

3

通过jQuery使用$.inArray()方法:

var a = ['502', '562', '584', '482', '392'];
var i = '482';

if ($.inArray(i, a) > -1) {
    alert(i);
}

参考资料:


请注意,如果兼容性是主要问题,则此方法非常好。如果您不必处理旧版IE,则本地实现建议更快。 - lonesomeday

3
switch(i)
{
   case 502:
   case 562:
   case 584:
   case 482:
   case 392: //do stuff
            break;
}

1

对象查找速度与变量查找速度几乎相同。

if ({
     "502": 1,
     "562": 1,
     "584": 1,
     "482": 1, // if you're concerned about conflict with `Object.prototype`
     "392": 1  // then consider using `{...}[i] === 1` or
     }[i]) {   // `{...}.hasOwnProperty(i)`
    // code if found
}

请注意,此方法不能区分i === 502i === '502',因为对象中的所有键都是字符串

1
虽然可能性不大,但如果i恰好是一个与Object.prototype上的方法同名的字符串,你就会得到错误的结果。再说一遍,这种情况相当少见,但我认为值得注意。使用.hasOwnProperty()会更安全。 - user2437417
@CrazyTrain 这是真的,constructorhasOwnPropertypropertyIsEnumerabletoLocaleStringtoStringvalueOf,以及 __define__lookup 用于 GetterSetter 的可能冲突。如果你知道你要查找的是一个字符串,就像在这个例子中一样,你就不必担心了,如果你想保持快速查找,你可以对设置的值进行 === 测试(即这里将会是 {...}[i] === 1)。 - Paul S.
创意解决方案!看起来完全可行。唯一可能的情况就是极端边缘情况,比如在 Object.prototype 上扩展带有真值数字的属性,或者更不可能的是像 Function.prototype.toString = function() { return 1; } 这样的情况... 是的,完全荒谬,不值得担心,但 技术上 可能。 :-) - user2437417
1
如果有人像这样向Object.prototype添加东西,除非是开玩笑,否则他们应该被禁止终身食用巧克力和饼干。_JavaScript_为此提供了原型和构造函数。 - Paul S.
1
完全同意!因此,假设大多数人喜欢巧克力,不喜欢有漏洞的JavaScript,这是“极端边缘情况”。 ;) - user2437417
显示剩余2条评论

1
虽然其他答案非常有用,但它们并不完全与您的代码相同。如果您将一个只包含数字的字符串与其表示的数字(以及可能具有与之相等的toString()的其他对象)进行比较,它们将相等(使用==)。但是,indexOf$.inArrayswitch则不是这样的情况:
var i = 502;
i == "502"' // True
["502"].indexOf(i) // False

您的代码的确切等效版本如下所示:

var VALUES = ['502', '562', '584', '482', '392'];

if(VALUES.some(function(e) { return e == i; }) {
   // do something
}

+1 这是唯一真正准确的替代方案,尽管它不会缩短代码,因为我猜这最终是想要的。但如果在多个地方都这样做,你可以给函数命名,然后只需执行 VALUES.some(compare),这将很好。 - user2437417
哎呀,我上面的函数需要是VALUES.some(compare(i)),其中compare返回一个函数。也许改进一下函数名为compareTo会更好... VALUES.some(compareTo(i)) - user2437417

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接