逻辑运算的捷径

时间:2016-02-02 09:47:48

标签: javascript conditional-operator

我只是想知道,逻辑运算符(&&||)是否有快捷方式。就像我想做i = i + 10之类的事情一样,我可以做i += 10

我正在搜索这个原因是因为我有一个验证功能,它分为几个功能。以下是模拟:

function f1(){
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function f2(){
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function f3(){
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function f4(){
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function validate(){
  var valid = true;
  valid = valid && f1();
  valid = valid && f2();
  valid = valid && f3();
  valid = valid && f4();
  
  console.log(valid);
}

validate();

我尝试过& =

function f1(){
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function f2(){
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function f3(){
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function f4(){
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function validate(){
  var valid = true;
  valid &= f1();
  valid &= f2();
  valid &= f3();
  valid &= f4();
  
  console.log(valid);
}

validate();

现在这可行,因为true & false = 00是假的,但这看起来更像是黑客,并且想知道是否有更好的方法来完成这样的任务?

注意:

我尝试了valid = f1() && f2() && f3 && f4();,但在这种方法中,如果任何函数返回false,则不会执行后续函数。

编辑1 - Nina的建议

function f1(){
  console.log("f1");
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function f2(){
  console.log("f2");
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function f3(){
  console.log("f3");
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function f4(){
  console.log("f4");
  return Math.ceil(Math.random()*10) %2 === 0? true:false
}

function validate(){
  var valid = true;
  var validateFuncList = [f1,f2,f3,f4];
  valid = validateFuncList.every(function (f) { return f(); });
  console.log(valid);
}

validate();

现在这是一个很好的答案,但如果有人返回false,则会停止,这与valid = f1() && f2() && f3 && f4();相同

编辑1

只是一个小小的更新。而不是:valid = valid && func1()valid = func1() && valid。如果有效func1,则第一种方法不会调用false

3 个答案:

答案 0 :(得分:2)

也许您使用数组。它调用所有函数。

function validate() {
    return [f1(), f2(), f3()].every(Boolean);
}

或使用数组作为参数

function validate(a) {
    return a.every(Boolean);
}

// call
xy = validate([f1(), f2(), f3()]);

答案 1 :(得分:0)

立即验证它们以缩短它们。

function validate(){
    var result = f1() && f2() && f3() && f4();
    console.log(result);
    return result;
}

基本上你只检查下一个f函数,如果前一个是真的,那就和你在代码中做的一样,除非它不需要继续(如果之前的一个)是假的。

请参阅:JavaScript Comparison and Logical Operators

答案 2 :(得分:0)

这是另一种更简洁的方法。按位 - 并且不会短路,因此所有功能都将执行。

function validate(){
  var valid = !!(f1() & f2() & f3() & f4());
  console.log(valid);
}

当然&是按位 - 而且不是逻辑 - 而且,只要你的函数返回布尔值,这没有任何区别。最后,如果这很重要,可以使用!!强制转换为布尔值。

相关问题