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+1
es 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 undefined
todo el tiempo (esto podría haber sido mencionado en la pregunta).
Docs
expr1 && expr2
: Si expr1
se 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
logicalAnd
como 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
false
así 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 true
si 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 false
una lista de argumentos vacía).
andMultipleExpr(1, 1, 0, 0)
oandMultipleExpr(1, 1, 1, 1)
andMultipleExpr()
(Llamar a la función sin parámetros)?