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 trueRun Code Online (Sandbox Code Playgroud)
你需要
从logicalAnd设置开始true
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)。)
早期返回应该使代码更高效和更短:
function andMultipleExpr() {
for (let i = 0; i < arguments.length; i++) {
if (!arguments[i]) {
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)