Javascript - 缩写表示的多条件if语句

4

我有几个if语句在我的脚本中,需要很多条件。我希望以更高效的方式编写它们,并使用“简写符号”使其更易于阅读。

例如,我有以下if语句:

if (x === 'abc' || x === 'def' || x === 'ghi' || x ==='jkl') {
    /*** some code ***/
}

我用indexOf和数组写了这个功能,但不确定这是否是最佳方法:

if (['abc', 'def', 'ghi' ,'jkl'].indexOf(x) > -1) {
   /*** some code ***/
}

我相信有一些更加简洁和快速的方法...


2
你所拥有的看起来最好。 - 4castle
谢谢你的回答。在我的情况下,我不能用'abcd'替换,那只是为了举例。如果我使用/(a|b|c|d)/.test(x),这样做会更好还是一样的? - freaky
1
在你所提供的例子中,我更喜欢使用数组--它更加简洁且能更好地传达意图:读者会看到“x在这一组数值中”而不是“a是x或b是x或c是x或d是x……”。对于更大的数值集合,它也能更好地扩展。有些人认为多个or语句更易读,让我感到惊讶。在这里担心性能还为时过早。 - Ant P
在我看来,使用数组也更易读。我也考虑过 /(a|b|c|d)/.test(x),但我认为它有点不太干净,而且目的也不同... - freaky
这个有没有简写方式?if (x === 'abc' && x === 'def' && x === 'ghi' && x ==='jkl') { /*** some code ***/ } - ajay
显示剩余7条评论
3个回答

5
你的数组易于阅读和修改。如果以后需要,它还可以作为参数传递。如果你使用ES6,你可能想要使用Array.prototype.includes
if (['abc', 'def', 'ghi', 'jkl'].includes(x)) {
   /*** some code ***/
}

担心性能问题在这种情况下是一种过早的优化。

谢谢你的回答和关于ES6 .include()的有用提示。我以后一定会用到它。 - freaky

1
如果你必须使用ES5,那么可以这样写:

if(~['abc', 'def', 'ghi' ,'jkl'].indexOf(x)) {...}

或者更加表达清晰的方式是:

if(!!~['abc', 'def', 'ghi' ,'jkl'].indexOf(x)) {...}


1

这实际上是一个可读性问题。当你在五个月后阅读相同的代码时,什么才是最容易理解的呢?

x === 'a' || x === 'b' || x === 'c' || x ==='d'

或者

['a', 'b', 'c' ,'d'].indexOf(x) > -1

我会使用长的“or”表达式,因为它非常清楚明确地告诉您代码正在做什么。但是,我会将该表达式包装在一个函数中,以使其余的代码更易读。
例如:
isSpecialLetter = function (x){
  return x === 'a' || x === 'b' || x === 'c' || x ==='d';
}

if(isSpecialLetter(x)){
//More code
}

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