0

在 JavaScript(和大多数其他编程语言)中,我注意到在检查同一变量的多个条件并为每个条件执行相同操作时,很难简洁地编写 if 语句。在这种情况下是否可以更简洁地编写 if 语句?

if(x==1|x==2|x==3){ //Is there any way to make this less verbose?
    console.log("X equals either 1 or 2 or 3!");
}

//this isn't syntactically correct, but it's more concise,
//and I wish it were possible to write it more like this
if(x==(1|2|3)){
    console.log("X equals either 1 or 2 or 3!");
}
4

5 回答 5

3

您可以使用正则表达式:

if (/^(1|2|3)$/.test(x)) { ... }
于 2013-03-29T16:45:21.333 回答
2

你可以使用这个:

if ([1, 2, 3].indexOf(x) >= 0) { ... }

如果您需要更复杂的相等性测试,您可以定义自己的函数并将其与内置some()迭代器一起使用:

function match(value1, value2) { var result = . . .; return result; }

if ([1, 2, 3].some(match.bind(null, x))) { . . . }

(bind出现在 JS 1.8.5 中;如果需要向后兼容,可以使用:

if ([1, 2, 3].some(function(elt) {return match(x, elt);})) { . . . }
于 2013-03-29T16:47:51.420 回答
1

或者

if([1, 2, 3].indexOf(x) !== -1){} //since JS 1.6

Array.indexOf

于 2013-03-29T16:49:58.093 回答
1

根据我的经验,大多数时候你可以通过定义一个返回布尔值的方法来使 if 语句更加简洁。您使代码更具可读性,更易于测试,甚至可能以这种方式重用更多代码。

当然,其他答案也很方便。

根据要求提供一个示例:

if (password.length < 6 || ! /[0-9]/.test(password) || password == userName) {
    alert('password doesn\'t meet security standards!');
}

对比

function isSecurePassword(pw, userName) {
    if (password.length < 6) return false;
    if (/[0-9]/.test(password)) return false;
    if (password == userName) return false;

    return true;
}

if ( ! isSecurePassword(pw, userName)) {
    alert(..);
}

(通常你可能会有对象和方法,并且不必传递变量)

于 2013-03-29T16:58:28.937 回答
1

是的,我经常想知道使用相同值的多个 if 语句的简写。

如果您有空闲时间,我建议您探索一些 JS 的函数式编程结构。您也许可以实现更优雅的解决方案。

我无法从头顶想出一个好的或声明,但“和”似乎没有更明智的选择。

var Cond = {
    'and': function(val, predicates) {
        return predicates.every( function(predicate) { return predicate(val) } );
    }
}

var predicates = [
    function(val) { return val > 40; }
    function(val) { return val < 45; }
    function(val) { return val === 42; }
];

console.log( Cond.and( 42, predicates ) );

My example is super lame but you should be easy enough to play around with.

于 2013-03-29T17:42:58.050 回答