Возможно, вы хотите услышать, что пошло не так с циклом:
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
- этот цикл хранит
&&
последние два элемента, с которыми он сталкивается. В идеальном случае это были бы &&
вместе два последних элемента массива (что уже не то, что вам нужно)
- Кроме того, в конце цикла
i=arguments.length-1
он проверяет последний элемент массива и i+1
является элементом «после» последнего, то есть undefined
. С точки зрения логических отношений это рассматривается false
, но в этом случае &&
создает само значение, и поэтому функция возвращает undefined
все время (это можно было упомянуть в вопросе).
Документы
expr1 && expr2
: Если expr1
можно преобразовать в true
, возвращает expr2
; еще, возвращается expr1
.
arr=[true];
console.log("your case:",arr[0] && arr[1]);
console.log("1 && 2:", 1 && 2);
Вместо этого, вы должны использовать в
logicalAnd
качестве аккумулятора, который собирает результат
&&
-ную все предыдущие элементы, и хитрость , что вы можете использовать, если в результате частичного
&&
является
false
, это не имеет значения , что остальные элементы, конечный результат будет
false
, поэтому цикл может немедленно остановиться:
function andMultipleExpr(){
let logicalAnd = arguments[0] || false;
for (let i = 1; i < arguments.length && logicalAnd; i++){
logicalAnd = logicalAnd && arguments[i];
}
return logicalAnd;
}
console.log("():",andMultipleExpr());
console.log("(false):",andMultipleExpr(false));
console.log("(true):",andMultipleExpr(true));
console.log("(true,true):",andMultipleExpr(true,true));
console.log("(true, true, false, false):",andMultipleExpr(true, true, false, false));
и затем вы можете оптимизировать его в соответствии с ответом Арчи : результат &&
-ing элементов - это true
если все элементы есть true
, и вам не нужно выполнять одну &&
операцию для вычисления результата:
function andMultipleExpr(){
if(arguments.length===0){
return false;
}
for (let i = 0; i < arguments.length; i++){
if(!arguments[i]){
return false;
}
}
return true;
}
console.log("():",andMultipleExpr());
console.log("(false):",andMultipleExpr(false));
console.log("(true):",andMultipleExpr(true));
console.log("(true,true):",andMultipleExpr(true,true));
console.log("(true, true, false, false):",andMultipleExpr(true, true, false, false));
(В приведенных выше фрагментах я стремился false
создать пустой список аргументов.)