JavaScript中用于连接逻辑运算符的简写方式是什么?

8

在JavaScript中,有没有更好的方法来编写以下条件语句?

if ( value == 1 || value == 16 || value == -500 || value == 42.42 || value == 'something' ) {
  // blah blah blah
}

我讨厌把所有逻辑OR串在一起。我想知道是否有某种简写方式。

谢谢!


投票关闭为重复项 检查变量是否等于值列表;是的,它更新,但那里的答案要更新得多。换句话说,那是更“规范”的帖子。 - Sebastian Simon
7个回答

5
var a = [1, 16, -500, 42.42, 'something'];
var value = 42;
if (a.indexOf(value) > -1){
// blah blah blah
}

更新: 根据评论提出的实用函数示例:

Object.prototype.in = function(){
  for(var i = 0; i < arguments.length; i++){
    if (this == arguments[i]) return true;
  }
  return false;
}

那么你可以这样写:

if (value.in(1, 16, -500, 42.42, 'something')){
// blah blah blah
}

8
请注意,Array.prototype.indexOf方法在IE浏览器上不可用。 - Christian C. Salvadó
1
@CMS 感谢您提供的有价值的通知。虽然可以立即修复。https://dev59.com/MnI-5IYBdhLWcg3wpqMK - Li0liQ
这可能是一个很好的实用函数,可以避免使if语句比原来更复杂。只需传入一个值数组,你就有了一种简写语法。 - JohnFx
4
我强烈建议不要在Object上进行原型设计。除了命名空间污染的普遍性之外,还存在破坏使用对象作为查找映射的代码的高风险。最好将此类实用方法放在Array.prototype上。这样可以对不继承自Object的东西(例如DOM节点)使用该方法。 - bobince
2
不要修改你没有所有权的对象,特别是 Object.prototypeDon't modify objects you don't own - Christian C. Salvadó
1
顺便说一下,@Li0liQ,“in”是一个保留字,因为它是一个关键字。不应该用作标识符... - Christian C. Salvadó

4

您可以扩展数组对象:

Array.prototype.contains = function(obj) {
  var i = this.length;
  while (i--) {
    if (this[i] == obj) {
      return true;
    }
  }
  return false;
}

如果您将所有这些值存储在数组中,那么您可以执行类似于MyValues.contains(value)的操作。

如果不需要类型强制转换,我建议使用 === 代替 ==,但在我看来,最好的方法是使用标准的 Array.prototype.indexOf 方法,正如 @Li0liQ 所提到的,该方法在所有浏览器上(除了IE)都可以 原生地 使用。 - Christian C. Salvadó

2

不对,那是速记法。

作为替代方案,您可以使用switch

switch (value) {
case 1 :
case 16 :
case -500 :
    ....
}

如果您需要大量可能的值,那么使用这种方式会更易于管理,但实际上您的版本仍然更短 :)


如果是混合类型,您可以将值转换为字符串并进行字符串比较。虽然速度较慢,但仍然可行。我认为这个选项比所提供的“indexOf”选项更易读。 - Matt S

1
var value= -55;
switch(value){
    case 1: case 16: case -55: case 42.5: case 'something': 
        alert(value); break;        

}

0

使用 switch 是一个可接受的选择。根据问题的复杂程度(假设您有比示例中更多的内容),您也可以使用 map。

var accept = { 1: true, 16: true, '-500': true, 42.42: true, something: true };
if (accept[value]) {
  // blah blah blah
}

accept 可以从课程数组中以编程方式生成。这取决于您计划使用此模式的程度。 :/


0

嗯,你可以使用 switch 语句...

switch (value) {
  case 1    : // blah
              break;
  case 16   : // blah
              break;
  case -500 : // blah
              break;
  case 42.42: // blah
              break;
  case "something" : // blah
                     break;
}

如果您使用的是JavaScript 1.6或更高版本,则可以在数组上使用indexOf符号:
if ([1, 16, -500, 42.42, "something"].indexOf(value) !== -1) {
   // blah
}

如果你想要达到最高的hack程度,你可以将值强制转换为字符串(这适用于所有浏览器):

if ("1,16,-500,42.42,something".indexOf(value) !== -1) {
   // blah
}

-1
为了尝试另一种方法...
if (/^(1|16|-500|42.42|something)$/.test(value)) {
  // blah blah blah
}

不需要扩展数组原型或其他任何东西,只需使用快速正则表达式来测试值!


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