Talvez você queira ouvir o que deu errado com o loop:
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
- esse loop armazena os
&&dois últimos itens que encontra. No caso ideal, reuniria &&os dois últimos elementos da matriz (que já não é o que você precisa)
- além disso, no final do loop
i=arguments.length-1, ele verifica o último elemento da matriz e i+1é o elemento "depois" do último, que é undefined. Em termos de relações lógicas, é considerado false, mas &&produz o valor em si mesmo, e é por isso que a função retorna undefinedo tempo todo (isso poderia ter sido mencionado na pergunta).
Documentos
expr1 && expr2: Se expr1pode ser convertido em true, retorna expr2; mais, retorna expr1.
arr=[true];
console.log("your case:",arr[0] && arr[1]);
console.log("1 && 2:", 1 && 2);
Em vez disso, você deve usar
logicalAndcomo um acumulador, que coleta o resultado de
&&todos os elementos anteriores, e um truque que você pode usar é se o resultado de uma parcial
&&for
false, não importa quais são os elementos restantes, o resultado final vai ser
false, então o loop pode parar imediatamente:
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));
e, em seguida, você pode otimizá-lo para a resposta de Archie : o resultado de &&itens -ing é truese todos os itens forem truee você não precisa executar uma única &&operação para calcular o resultado:
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));
(Nos trechos acima, pretendi produzir falsepara uma lista de argumentos vazia.)