Возможно, вы хотите услышать, что пошло не так с l oop:
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
- этот l oop хранит
&&
из последних двух предметы, с которыми он сталкивается. В идеальном случае это будет &&
вместе два последних элемента массива (что уже не то, что вам нужно) - поверх этого в конце l oop
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
, поэтому l oop может немедленно остановиться:
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));
и затем вы можете оптимизировать его до Arch ie s answer : результат &&
-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
для пустого списка аргументов.)