Quizás quieras escuchar qué salió mal con el bucle:
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
- Este bucle almacena los
&&dos últimos elementos que encuentra. En el caso ideal, reuniría &&los dos últimos elementos de la matriz (que ya no es lo que necesita)
- además de eso al final del ciclo
i=arguments.length-1, verificará el último elemento de la matriz, y i+1es el elemento "después" del último, que es undefined. En términos de relaciones lógicas, se considera false, pero &&produce el valor en sí mismo en ese caso, y es por eso que la función regresa undefinedtodo el tiempo (esto podría haber sido mencionado en la pregunta).
Docs
expr1 && expr2: Si expr1se puede convertir a true, devuelve expr2; De lo contrario, vuelve expr1.
arr=[true];
console.log("your case:",arr[0] && arr[1]);
console.log("1 && 2:", 1 && 2);
En cambio, debe usarlo
logicalAndcomo un acumulador, que recoge el resultado de
&&-ing todos los elementos anteriores, y un truco que puede usar es que si el resultado de un parcial
&&es
false, no importa cuáles sean los elementos restantes, el resultado final va a ser
falseasí que el ciclo puede detenerse de inmediato:
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));
y luego puede optimizarlo hacia la respuesta de Archie : el resultado de &&-ing items es truesi todos los ítems son true, y no tiene que ejecutar una sola &&operación para calcular el 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));
(En los fragmentos anteriores, pretendía producir falseuna lista de argumentos vacía).