web-dev-qa-db-fra.com

Quel opérateur logique a la priorité

Je cherche donc à écrire une opération légèrement plus complexe avec des opérateurs logiques dans une instruction if-else. Je sais que je peux faire des parenthèses, et je sais que c'est la meilleure façon de le faire, mais je suis devenu curieux et je vais donc demander. Si je devais faire quelque chose comme ça:

if (firstRun == true || selectedCategory != undefined && selectedState != undefined) {
//Do something
} else {
//Do something else
}

Comment cela fonctionnera-t-il sans utiliser de parenthèses? Je sais qu'il existe un ordre d'opérations pour les opérateurs logiques, similaire à PEMDAS, non? Je suis curieux de savoir si ça se déroulera comme ceci:

firstRun == true || (selectedCategory != undefined && selectedState != undefined)

ou peut-être si l'opérateur 'OU' a la priorité à la place et qu'il finit par se présenter comme:

(firstRun == true || selectedCategory != undefined) && selectedState != undefined

La liste complète serait Nice, si vous pouvez la trouver quelque part, de l'ordre des opérations pour cela. Merci!

53
JTApps

Ma règle générale, qui couvre essentiellement 99% de tous les cas d'utilisation des instructions conditionnelles, est la suivante:

  1. Regroupement: ()
  2. Accès membre . or [...]
  3. Ne pas: !
  4. Comparaison, par ex. < , >= , === , !=, ...
  5. Logique ET &&
  6. Logique OR ||

MDN vous donne la ventilation exhaustive: Javascript Operator Precedence

donc pour votre exemple:

(firstRun == true || selectedCategory != undefined && selectedState != undefined)

équivaut à

(firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined))

Pour quelque chose de plus complexe que les cas mentionnés ci-dessus, je chercherais à refactoriser le code pour des raisons de lisibilité de toute façon!

68
Christoph

Il existe une assez bonne règle empirique à ce sujet. Considérez ces opérateurs comme des opérateurs mathématiques:

  • AND est une multiplication (par exemple. 0 * 1 = 0 => FALSE)
  • OR est en train d'ajouter (par exemple. 0 + 1 = 1 => TRUE)

Lorsque vous vous en souvenez, tout ce que vous devez savoir, c'est que la multiplication vient toujours avant l'addition.

20
Michal Leszczyk

Voir ce tableau pour la priorité .

Je ne vais pas expliquer ce qui se passe parce que le prochain gars qui lira votre code pensera: "WTF? Est-ce que ça fait ce qu'il devrait?"

Donc, la meilleure solution est de mettre les termes entre parenthèses même si vous connaissez la priorité, appliquez-la correctement et le code fonctionne

Cela suit la vieille sagesse selon laquelle vous ne devriez pas faire tout ce que vous pouvez simplement parce que vous pouvez le faire. Gardez toujours un œil sur les conséquences.

9
Aaron Digulla

https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence

&& est avant ||, donc votre expression équivaut à:

firstRun == true || (selectedCategory != undefined && selectedState != undefined)
3
Blindy

Bien que la priorité de l'opérateur logique ne soit pas réellement définie dans la spécification ECMAScript , MDN fait un très bon travail et a même un page pour Opérateurs logiques .

Ma préoccupation, je suppose, puisque la priorité de l'opérateur logique n'est pas réellement définie dans la spécification ECMAScript, chaque fournisseur de navigateur peut potentiellement être différent (je vous parle, Internet Explorer!) Donc YMMV.

Si quelqu'un veut tester cela sur différents navigateurs, voici un violon de cas de test: http://jsfiddle.net/HdzXq/

1
pete

Ce sera le premier:

firstRun == true || (selectedCategory != undefined && selectedState != undefined)

En règle générale dans la plupart des langages de programmation ET a une priorité plus élevée

1
Mariy

Je sais que c'est un ancien poste, mais je me demandais si l'ordre devait être inversé. J'ai toujours pensé que la moitié la plus exigeante d'une déclaration ou devait être répertoriée en premier, car elle est moins susceptible de passer:

La réponse correcte de Cristoph:

(firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined))

Doit-il réellement être écrit comme suit:

((selectedCategory != undefined) && (selectedState != undefined) || firstRun == true))

J'ai l'impression qu'il y a de fortes chances que vous n'atteigniez même jamais la seconde moitié du premier exemple.

Laissez-moi savoir ce que vous pensez.

0
Mitchell