Gostaria de saber se JavaScript tem avaliação de "curto-circuito" como && Operator em C #. Caso contrário, gostaria de saber se há uma solução alternativa que faça sentido adotar.
Gostaria de saber se JavaScript tem avaliação de "curto-circuito" como && Operator em C #. Caso contrário, gostaria de saber se há uma solução alternativa que faça sentido adotar.
Respostas:
Sim, o JavaScript tem avaliação de "curto-circuito".
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
Short-circuit
com esse operador lógico. Apenas tente você mesmo. Use minha demonstração.
Essa resposta fornece muitos detalhes sobre como curto-circuitofunciona em JavaScript, com todas as pegadinhas e também temas relevantes como precedência de operador, se você está procurando uma definição rápida e já entende como funciona o curto-circuito, recomendo verificar outras respostas.
Primeiro, vamos inspecionar o comportamento com o qual todos estamos familiarizados, dentro do if()
bloco, onde usamos &&
para verificar se as duas coisas são true
:
if (true && true) {
console.log('bar');
}
Agora, seu primeiro instinto é provavelmente dizer: 'Ah sim, muito simples, o código executa a instrução se ambos expr1
e expr2
forem avaliados como true
'
Bem, sim e não. Você está tecnicamente correto, esse é o comportamento que você descreveu, mas não é exatamente assim que o código é avaliado e precisaremos nos aprofundar para entendê-lo completamente.
&&
e ||
interpretado ?:É hora de olhar "sob o capô do javascript motor ". Vamos considerar este exemplo prático:
function sanitise(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5
console.log(res);
Bem, o resultado é 260
.. mas por quê? Para obter a resposta, precisamos entender como funciona a avaliação de curto-circuito.
Pela Definição MDN, o
&&
operador emexpr1 && expr2
é executado da seguinte forma:Se
expr1
pode ser convertido paratrue
, retornaexpr2
; mais, retornaexpr1
.
Isso significa que, em nosso exemplo prático, o const res
é avaliado da seguinte maneira:
expr1
-sanitise(0xFF)
0xFF
é um número hexadecimal válido para 250, caso contrário, eu retornaria NaN
expr1
retornou um valor "verdadeiro", hora de execução expr2
(caso contrário, eu pararia porque NaN
é falso)userinput
é verdadeiro (um número), posso adicionar +5
a eleEntão, aqui, fomos capazes de evitar if
bloqueios adicionais e isNaN
verificações adicionais com um simples uso do &&
operador.
Agora, devemos ter pelo menos uma imagem de como o curto circuitoos operadores trabalham. A regra universal é:
(some falsy expression) && expr
será avaliado como expressão falsa(some truthy expression) || expr
avaliará a expressão verdadeiraAqui estão mais alguns exemplos para melhor compreensão:
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
Legal, espero que você esteja pegando o jeito! A última coisa que precisamos saber é uma regra sobre a precedência do operador, que é:
&&
operador é sempre executado antes do ||
operador.Considere o seguinte exemplo:
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
Isso retornará como, talvez de forma confusa para alguns como a()
. A razão é bastante simples, é apenas a nossa visão que meio que nos engana, porque estamos acostumados a ler da esquerda para a direita. Vamos tirar o console.log()
e o que não é e focar puramente na avaliação
true || false && false
Agora, para entender isso:
Dissemos que o &&
operador tem precedência, portanto, ele é avaliado como o primeiro. Para nos ajudar a imaginar melhor a avaliação, pense na definição
expr1 && expr2
Onde:
expr2
é false
expr1
é true || false
Então essa foi a parte complicada, agora true || false
é avaliada (o expr1
- lado esquerdo do &&
).
||
operador interrompe a execução se expr1 || expr2
in for expr1
avaliado como verdadeiro, o expr1
é executado e a execução do código é interrompida.O valor retornado é true
Bem ... isso foi bem complicado, tudo por causa de algumas regras e semânticas estranhas. Mas lembre-se, você sempre pode escapar da precedência do operador com o ()
- assim como na matemática
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/
expr1
e expr2
ou condition1
ou qualquer outra coisa, que está apenas confuso. Decida por um, você também pode introduzir variáveis locais, por exemplo. const expr1 = true; if(expr1 && ...)
https://www.google.com/search?q=site:stackoverflow.com+%s
como um atalho de pesquisa (Chrome / Firefox) para acelerar as pesquisas.