function andMultipleExpr(){
let logicalAnd;
let i;
for (i = 0; i < arguments.length; i++){
logicalAnd = arguments[i] && arguments[i+1];
}
return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));
Lo que espero es ejecutar este código: verdadero && verdadero && false && false y eso debería devolver falso .
¿Cómo hacer que eso funcione en js? Gracias
javascript
function
Hakim Asa
fuente
fuente

andMultipleExpr(1, 1, 0, 0)oandMultipleExpr(1, 1, 1, 1)andMultipleExpr()(Llamar a la función sin parámetros)?Respuestas:
Use
Array.prototype.everyen todos los argumentos pasados para verificar si todos son verdaderos;fuente
e => e === trueconBooleantrue.===en el código del OP. Sin embargo, sueveryidea es acertada . Pero solo.every(e => e)hace el trabajo.const isTrue = x => x === true(ox => !!xpara todos los valores de verdad), puede comprimir su soluciónreturn arguments.every(isTrue). Lo que me parece simplemente hermoso.Necesitas
Comience con
logicalAndestablecer entrueÚselo
logicalAndal actualizarlo, en lugar de utilizar dos entradas deargumentsEl cambio mínimo es:
Pero la solución de mbojko tiene la ventaja de provocar un cortocircuito (detener el ciclo cuando encuentra por primera vez un valor falso), lo que parece una buena idea.
Dado que está utilizando ES2015 +, probablemente debería usar un parámetro rest en lugar de
arguments, y puede usar unfor-ofbucle:También puede cortocircuitar eso de acuerdo con el enfoque de mbojko
Algunas personas podrían lanzarse
reducea esto, pero laeverysolución de Archie es mucho mejor. (Pero como su comparación no es estricta, simplemente lo haría.every(flag => flag)).fuente
[].reduce((a,b)=>a && b)arroja.Los retornos tempranos deberían hacer que el código sea más eficiente y más corto:
fuente
Creo que este es un camino muy corto usando ES6
Array.prototype.reducePara obtener más explicaciones sobre la función de reducción, lea MDN
fuente
everycomo Archie hizo quereduce. Más simple, y cortocircuitos.everyasome. Aún más simple. Todavía cortocircuitos.Puede tomar
Array#everyy devolver el último valor.Este enfoque devuelve el resultado real de AND lógico
&&.Al utilizar el enfoque, se crea un cortocircuito para el primer valor falso encontrado. Entonces la iteración se detiene.
fuente
Quizás quieras escuchar qué salió mal con el bucle:
&&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)i=arguments.length-1, verificará el último elemento de la matriz, yi+1es el elemento "después" del último, que esundefined. En términos de relaciones lógicas, se considerafalse, pero&&produce el valor en sí mismo en ese caso, y es por eso que la función regresaundefinedtodo el tiempo (esto podría haber sido mencionado en la pregunta).Docs
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&&esfalse, no importa cuáles sean los elementos restantes, el resultado final va a serfalseasí que el ciclo puede detenerse de inmediato:y luego puede optimizarlo hacia la respuesta de Archie : el resultado de
&&-ing items estruesi todos los ítems sontrue, y no tiene que ejecutar una sola&&operación para calcular el resultado:(En los fragmentos anteriores, pretendía producir
falseuna lista de argumentos vacía).fuente