Возможно, вы хотите услышать, что пошло не так с циклом:
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создать пустой список аргументов.)