缩短JS的if语句

11

有没有办法在JavaScript中缩短这样的代码:if (x == 1 || x == 2 || x == 3 || x == 4),使它看起来像这样:if (x == (1 || 2 || 3 || 4))?


如果你正在寻找类似于你发布的语法,那么不是的。你应该考虑到任何缩短方式都会导致性能降低。 - user113716
数字被用作例子,所以如果我要比较字符串,使用 "if(x>0 && x <5)" 就不会有用了。 - John
5个回答

7
你可以使用 Array.indexOf 来实现。
[1,2,3,4].indexOf(x) !== -1

你也可以将对象用作一种哈希映射:

//Note: Keys will be coerced to strings so
// don't use this method if you are looking for an object or if you need
// to distinguish the number 1 from the string "1"
my_values = {1:true, 2:true, 3:true, 'foo':true}
my_values.hasOwnProperty('foo')

顺便提一下,在大多数情况下,您应该使用“===”严格相等运算符而不是“==”运算符。使用“==”进行比较可能会进行许多复杂的类型强制转换,有时会得到令人惊讶的结果。


2
有时候,“==”是有用的,但你可能是对的,JavaScript程序员应该自动输入“===” :-) - Pointy
1
谈到强制转换,对象初始化器会做三次 :-P - Free Consulting

2
如果您的情况不那么简单,无法用这种方式表达:
if (1 <= x && x <= 4)

您可以使用一个数组和indexOf方法来实现:

数组和indexOf 方法:

if ([1,2,3,4].indexOf(x) > -1)

请注意,indexOf可能需要重新实现。

去除空格后,实际上比 indexOf() 函数返回的字符串长度多1个字符,但是在匹配项较多时,它会更短。我想这取决于实际的代码。 - user113716

1

这样如何:

if (x > 0 && x < 5) {
} 

我原本以为是这样,但后来意识到John只是举了一个简化的例子,而不是一个实际案例。 - Tom Gullen

1

不写一个以数组为输入并返回true/false或某种数组搜索的函数是不可能的,否则很难维护/其他开发人员阅读。而且速度会明显变慢。所以最好坚持语义上正确但较长的版本。

另外,检查是否有任何可以大幅缩短的方法是将其通过紧凑编译器运行并查看输出结果。


我赞同这个观点。将像这样的复杂检查封装到函数中以更好地传达含义通常是一个好主意。 - Juho Vepsäläinen

0
你可以编写一个函数:
function isAny(x) {
  for (var i = 1; i < arguments.length; ++i)
    if (arguments[i] === x) return true;
  return false;
}

然后你可以说:

if (isAny(x, 1, 2, 3, 4)) { /* ... */ }

使用 "===" 还是 "==" 取决于您想要的确切语义。


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