AND 多个参数

Hak*_*Asa 13 javascript function

function andMultipleExpr(){
  let logicalAnd;
  let i;
  for (i = 0; i < arguments.length; i++){
    logicalAnd =  arguments[i] && arguments[i+1];
  }
  return logicalAnd;
}

console.log(andMultipleExpr(true, true, false, false));
Run Code Online (Sandbox Code Playgroud)

我期望的是执行以下代码:true&&true&&&false&&false并且应该返回false

如何在 js 中做到这一点?谢谢

小智 15

使用Array.prototype.every上的所有传递的参数检查,如果他们都是真实的;

function andMultipleExpr(...a) {
  if(a.length === 0) return false; // return false when no argument being passed
  return a.every(Boolean);
}

console.log(andMultipleExpr(true, true, false)); // should return false
console.log(andMultipleExpr(true, true, true)); // should return true
Run Code Online (Sandbox Code Playgroud)


T.J*_*der 8

你需要

  1. logicalAnd设置开始true

  2. logicalAnd更新时使用,而不是使用两个条目arguments

最小的变化是:

function andMultipleExpr(){
    let logicalAnd = true; // ***
    let i;
    for (i = 0; i < arguments.length; i++){
        logicalAnd = logicalAnd && arguments[i]; // ***
    }
    return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));
Run Code Online (Sandbox Code Playgroud)

但是mbojko 的解决方案具有短路的优点(当它第一次发现一个假值时停止循环),这似乎是一个好主意。

由于您使用的是 ES2015+,您可能应该使用 rest 参数而不是arguments,并且您可以使用for-of循环:

function andMultipleExpr(...flags) {
    let logicalAnd = true;
    for (const flag of flags) {
        logicalAnd = logicalAnd && flag;
    }
    return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));
Run Code Online (Sandbox Code Playgroud)

您也可以按照mbojko 的方法将其短路

function andMultipleExpr(...flags) {
    for (const flag of flags) {
        if (!flag) {
            return false;
        }
    }
    return true;
}
console.log(andMultipleExpr(true, true, false, false));
Run Code Online (Sandbox Code Playgroud)

有些人可能会reduce对此不屑一顾every,但Archie 的解决方案要好得多。(但由于您的比较不严格,我就去做了.every(flag => flag)。)


mbo*_*jko 5

早期返回应该使代码更高效和更短:

function andMultipleExpr() {
  for (let i = 0; i < arguments.length; i++) {
    if (!arguments[i]) {
      return false;
    }
  }

  return true;
}
Run Code Online (Sandbox Code Playgroud)