Question Qu'est-ce que "x && foo ()"?


j'ai vu quelque part sinon dit,

x && foo();

est égal à

if(x){
    foo();
}

Je l'ai testé et ils ont vraiment fait la même chose.
Mais pourquoi? Qu'est ce que c'est x && foo()?


40
2017-08-07 02:32


origine


Réponses:


Les deux opérateurs AND et OR peuvent raccourcir.

Alors && n'essaie que la deuxième expression si la première est vraie (semblable à la vérité, plus précisément). Le fait que la deuxième opération fasse des choses (quel que soit le contenu de foo() fait) n'a pas d'importance parce qu'il n'est pas exécuté sauf si cette première expression évalue quelque chose de véridique. Si c'est vrai, alors volonté être exécuté pour essayer le deuxième test.

Inversement, si la première expression dans un || La déclaration est vraie, la seconde ne se touche pas. Ceci est fait parce que toute l'instruction peut déjà être évaluée, l'instruction donnera true quel que soit le résultat de la seconde expression, elle sera donc ignorée et restera non exécutée.

Les cas à surveiller lors de l’utilisation de raccourcis comme celui-ci, bien sûr, sont les cas où des opérateurs définissent toujours des variables définies comme des valeurs fausses (par ex. 0), et ceux de vérité (par ex. 'zero').


64
2017-08-07 02:35



Ceci est connu comme évaluation de court-circuit.

Dans ce cas, si x est faux, alors foo() n'a pas besoin d'être évalué (le résultat de && sera toujours faux); si x est vrai, il doit être évalué (même si le résultat est rejeté).


24
2017-08-07 02:38



Ce n'est pas exactement équivalent. Le premier est une expression avec une valeur de retour que vous pouvez utiliser; le second est une déclaration.

Si la valeur de retour ne vous intéresse pas (c’est-à-dire si les deux x et foo() évaluer à une valeur de vérité), ils sont équivalents, mais normalement, vous devriez utiliser la version boolean-logic uniquement si vous voulez l'utiliser comme une expression booléenne, par exemple:

if (x && foo()) {
    do_stuff();
}

Si vous êtes seulement intéressé par la course foo() conditionnellement (quand x est vrai), la seconde forme doit être préférée, car elle traduit plus clairement l'intention.

Une des raisons pour lesquelles les utilisateurs préfèrent la version boolean-logic peut être que javascript est soumis à une restriction inhabituelle: taille du code source (un code source plus prolixe signifie plus de bande passante utilisée); comme la version boolean-logic utilise moins de caractères, elle est plus efficace en termes de bande passante. Je préfère toujours la version la plus prolixe la plupart du temps, à moins que le script en question ne soit beaucoup utilisé - pour une bibliothèque comme jQuery, utiliser de telles optimisations est parfaitement justifiable, mais dans la plupart des autres cas, ce n'est pas le cas.


8
2017-08-07 12:14



En javascript, le && l'opérateur évalue de gauche à droite et renvoie la valeur de l'opération la plus à droite. Si la première condition est fausse, elle n'évalue pas la seconde. C'est donc un raccourci de dire "si quelque chose n'est pas nul ou non défini, faites quelque chose"


3
2017-08-07 02:35



C'est un court-circuit.

le && L'opérateur fonctionne comme ceci: il fait la logique ou des deux opérandes des deux côtés. Si le côté gauche a une valeur non nulle, le côté droit est évalué pour déterminer la valeur de vérité. Si le côté gauche est zéro, quelle que soit la partie droite, l'expression sera évaluée à 0, donc le côté droit est ne pas évalué. Donc, en effet, si x est non nul alors seulement foo est appelé, et si x est 0 alors foo n'est pas appelé, et donc, cela fonctionne comme if - else dans ce cas.


2
2017-08-07 02:39