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 undefined
o tempo todo (isso poderia ter sido mencionado na pergunta).
Documentos
expr1 && expr2
: Se expr1
pode 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
logicalAnd
como 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 é true
se todos os itens forem true
e 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 false
para uma lista de argumentos vazia.)