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.
javascript
short-circuiting
GibboK
fonte
fonte
https://www.google.com/search?q=site:stackoverflow.com+%s
como um atalho de pesquisa (Chrome / Firefox) para acelerar as pesquisas.Respostas:
Sim, o JavaScript tem avaliação de "curto-circuito".
Demonstração ao vivo
Demonstração ao vivo
fonte
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.
O que nós (pensávamos) sabíamos até agora:
Primeiro, vamos inspecionar o comportamento com o qual todos estamos familiarizados, dentro do
if()
bloco, onde usamos&&
para verificar se as duas coisas sãotrue
:Agora, seu primeiro instinto é provavelmente dizer: 'Ah sim, muito simples, o código executa a instrução se ambos
expr1
eexpr2
forem avaliados comotrue
'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.
Como exatamente é o
&&
e||
interpretado ?:É hora de olhar "sob o capô do javascript motor ". Vamos considerar este exemplo prático:
Bem, o resultado é
260
.. mas por quê? Para obter a resposta, precisamos entender como funciona a avaliação de curto-circuito.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 retornariaNaN
expr1
retornou um valor "verdadeiro", hora de execuçãoexpr2
(caso contrário, eu pararia porqueNaN
é falso)userinput
é verdadeiro (um número), posso adicionar+5
a eleEntão, aqui, fomos capazes de evitar
if
bloqueios adicionais eisNaN
verificações adicionais com um simples uso do&&
operador.Como realmente funciona:
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:
Uma última coisa incômoda, mas muito importante [precedência do operador]:
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:
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 oconsole.log()
e o que não é e focar puramente na avaliaçãoAgora, 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çãoOnde:
expr2
éfalse
expr1
étrue || false
Então essa foi a parte complicada, agora
true || false
é avaliada (oexpr1
- lado esquerdo do&&
).||
operador interrompe a execução seexpr1 || expr2
in forexpr1
avaliado como verdadeiro, oexpr1
é 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áticafonte
expr1
eexpr2
oucondition1
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 && ...)