0

也许我错过了一些东西,但是有没有更好/更简洁的方式来写这样的东西:

var a=1,
    b=2,
    c=3;
if(a===1 && b===1 && c===1){ do something };

或者

if(a===1 || b===1 || c===1){ do something };

我试图保持代码很小,所以我不希望像我遇到的页面中建议的那样遍历数组等。我认为会有一些东西(至少对于第一个例子来说它们都是一样的)看起来像

if(a=b=c===1){ do something? };

谢谢!

4

3 回答 3

4

您可以采用函数式方法,并创建一个简单的比较函数生成器:

function eq(val) {
    return function(x) {
        return x === val
    }
}

然后.every用于&&

if ([a,b,c].every(eq(1))) {
    // all were equal
}

.some用于||

if ([a,b,c].some(eq(1))) {
    // at least one was equal
}

您还可以创建一个接收条件结果的函数和一个在条件为真时调用的函数:

function when(cond, fn) {
    if (cond)
        fn.call.apply(fn, [].slice.call(arguments, 2))
}

并将你的if身体封装成一个函数......

function doIt(arg1, arg2) {
    console.log("doing it!")
    console.log(this, arg1, arg2)
}

然后像这样使用它:

when([a,b,c].every(eq(1)), doIt, null, "foo", "bar")

第三个参数when设置this回调的值,随后的参数作为参数传递给回调。

于 2013-05-25T18:06:55.043 回答
2

不,没有。您必须单独检查它们。JavaScript 只是没有用于您要执行的操作的运算符。

你的if(a=b=c===1){ ...(我意识到这只是一个例子)将设置为 a如果)或(如果没有),然后仅基于.btruec===1falsec===1

我的意思是,对于这种特定情况,有几种数学方法,但在一般情况下,没有。

于 2013-05-25T17:07:04.607 回答
0

根据您想投资多少,这将是一个可能的解决方案:

var slice=Function.call.bind([].slice)

var checkCondition=function(condition){ 
    return function(){
        return slice(arguments).reduce(function(o,n){
            return o && o == condition(n);
        },true);
    }
}

greater5=checkCondition(function(x){ return x>5; });

console.log(greater5(4,7));

如果您的代码中只有一两次必须检查多个变量,那绝对是矫枉过正。但是,如果您有多个具有不同参数的地方,它可能会有所帮助。

您可以通过定义另一个函数轻松定义新检查并添加任意数量的变量。

于 2013-05-25T17:21:04.793 回答