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));
O que eu estou esperando é executar este código: true && true && false && false e isso deve retornar false .
Como fazer isso funcionar em js? obrigado
javascript
function
Hakim Asa
fonte
fonte
andMultipleExpr(1, 1, 0, 0)
ouandMultipleExpr(1, 1, 1, 1)
andMultipleExpr()
(Chamando a função sem parâmetros)?Respostas:
Use
Array.prototype.every
em todos os argumentos passados para verificar se todos são verdadeiros;fonte
e => e === true
porBoolean
true
.===
no código do OP. Suaevery
ideia é certa , no entanto. Mas apenas.every(e => e)
faz o trabalho.const isTrue = x => x === true
(oux => !!x
para todos os valores reais), poderá compactar sua soluçãoreturn arguments.every(isTrue)
. O que para mim parece bonito.Você precisa
Comece com
logicalAnd
definido comotrue
Use
logicalAnd
ao atualizá-lo, em vez de usar duas entradas dearguments
A mudança mínima é:
Mas a solução da mbojko tem a vantagem de causar um curto-circuito (interromper o ciclo quando encontrar um valor falso), o que parece uma boa ideia.
Como você está usando o ES2015 +, você provavelmente deve usar um parâmetro rest em vez de
arguments
e pode usar umfor-of
loop:Você também pode causar um curto-circuito, de acordo com a abordagem da mbojko
Algumas pessoas podem pensar
reduce
nisso, mas aevery
solução de Archie é muito melhor. (Mas, como sua comparação não é rigorosa, é só fazê-lo.every(flag => flag)
.)fonte
[].reduce((a,b)=>a && b)
lança.Os retornos antecipados devem tornar o código mais eficiente e mais curto:
fonte
Eu acho que essa é uma maneira muito curta de usar o ES6
Array.prototype.reduce
Para mais explicações sobre a função de redução, leia MDN
fonte
every
como o Archie do quereduce
. Mais simples, e curto-circuitos.every
parasome
. Ainda mais simples. Ainda curto-circuito.Você pode pegar
Array#every
e retornar o último valor.Essa abordagem retorna o resultado real do AND lógico
&&
.Usando a abordagem, é feito um curto-circuito para o primeiro valor encontrado de falsidade. Então a iteração pára.
fonte
Talvez você queira ouvir o que deu errado com o loop:
&&
dois últimos itens que encontra. No caso ideal, reuniria&&
os dois últimos elementos da matriz (que já não é o que você precisa)i=arguments.length-1
, ele verifica o último elemento da matriz ei+1
é o elemento "depois" do último, que éundefined
. Em termos de relações lógicas, é consideradofalse
, mas&&
produz o valor em si mesmo, e é por isso que a função retornaundefined
o tempo todo (isso poderia ter sido mencionado na pergunta).Documentos
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&&
forfalse
, não importa quais são os elementos restantes, o resultado final vai serfalse
, então o loop pode parar imediatamente:e, em seguida, você pode otimizá-lo para a resposta de Archie : o resultado de
&&
itens -ing étrue
se todos os itens foremtrue
e você não precisa executar uma única&&
operação para calcular o resultado:(Nos trechos acima, pretendi produzir
false
para uma lista de argumentos vazia.)fonte