Je voudrais savoir si JavaScript a une évaluation "court-circuit" comme && Operator en C #. Sinon, j'aimerais savoir s'il existe une solution de contournement qui a du sens à adopter.
javascript
short-circuiting
GibboK
la source
la source
https://www.google.com/search?q=site:stackoverflow.com+%s
un raccourci de recherche (Chrome / Firefox) pour accélérer les recherches.Réponses:
Oui, JavaScript a une évaluation "court-circuit".
DÉMO en direct
DÉMO en direct
la source
Short-circuit
avec cet opérateur logique. Essayez-le vous-même. Utilisez ma démo.Cette réponse explique en détail comment court-circuit fonctionne en JavaScript, avec tous les goûts et thèmes pertinents tels que la priorité des opérateurs, si vous recherchez une définition rapide et que vous comprenez déjà le fonctionnement du court-circuit, je vous recommande de vérifier d'autres réponses.
Ce que nous (pensions que nous) savions jusqu'à présent:
Commençons par inspecter le comportement que nous connaissons tous, à l'intérieur du
if()
bloc, où nous utilisons&&
pour vérifier si les deux choses sonttrue
:Maintenant, votre premier instinct est probablement de dire: 'Ah oui, assez simple, le code exécute l'instruction si les deux
expr1
etexpr2
sont évalués commetrue
'Eh bien, oui et non. Vous avez techniquement raison, c'est le comportement que vous avez décrit, mais ce n'est pas exactement ainsi que le code est évalué et nous devrons approfondir afin de bien comprendre.
Comment est interprété exactement le
&&
et||
?:Il est temps de regarder "sous le capot du javascript engine ". Prenons cet exemple pratique:
Eh bien, le résultat est
260
... mais pourquoi? Afin d'obtenir la réponse, nous devons comprendre comment fonctionne l'évaluation des courts-circuits.Cela signifie donc, dans notre exemple pratique, que le
const res
est évalué de la manière suivante:expr1
-sanitise(0xFF)
0xFF
est un nombre hexadécimal valide pour 250, sinon je retourneraisNaN
expr1
renvoyé une valeur "véridique", temps d'exécutionexpr2
(sinon je m'arrêterais commeNaN
faux)userinput
est truthy (un numéro), je peux ajouter+5
à ceDonc ici, nous avons pu éviter des
if
blocages supplémentaires et desisNaN
contrôles supplémentaires avec une simple utilisation de l'&&
opérateur.Comment ça marche vraiment:
À présent, nous devrions au moins avoir une image de la façon dont le court-circuitles opérateurs travaillent. La règle universelle va:
(some falsy expression) && expr
évaluera une expression erronée(some truthy expression) || expr
évaluera l'expression de la véritéVoici quelques exemples supplémentaires pour une meilleure compréhension:
Une dernière chose embêtante, mais très importante [Operator Precedence]:
Bien, j'espère que vous comprenez le coup! La dernière chose que nous devons savoir est une règle sur la priorité des opérateurs, à savoir:
&&
opérateur est toujours exécuté avant l'||
opérateur.Prenons l'exemple suivant:
Cela reviendra comme, peut-être déroutant pour certains
a()
. La raison est assez simple, c'est juste notre vue qui nous trompe, parce que nous avons l'habitude de lire de gauche à droite. Prenons leconsole.log()
et ce qui ne l'est pas et concentrons-nous uniquement sur l'évaluationMaintenant, pour comprendre ceci:
Nous avons dit que l'
&&
opérateur a la priorité, donc il est évalué comme premier. Pour nous aider à mieux imaginer l'évaluation, pensez à la définitionOù:
expr2
estfalse
expr1
esttrue || false
C'était donc la partie délicate, maintenant
true || false
est évaluée (leexpr1
- côté gauche de la&&
).||
opérateur arrête l'exécution siexpr1 || expr2
in estexpr1
évalué comme véridique, leexpr1
est exécuté et l'exécution du code s'arrête.La valeur renvoyée est
true
Eh bien… c'était assez délicat, tout cela à cause de quelques règles et sémantiques étranges. Mais rappelez-vous que vous pouvez toujours échapper à la priorité des opérateurs avec
()
- comme en mathsla source
expr1
etexpr2
oucondition1
ou de quoi que ce soit, c'est juste déroutant. Choisissez-en un, vous pouvez également introduire des variables locales, par exemple.const expr1 = true; if(expr1 && ...)