Можливо, ви хочете почути, що пішло не так з циклом:
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як акумулятор, який збирає результат
&&-ing всіх попередніх елементів, і хитрість, яку ви можете використовувати, якщо результат часткового
&&є
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));
а потім ви можете оптимізувати його в сторону Арчі відповіді : результат &&-ву елементів є , 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створити порожній список аргументів.)