Précédence des opérateurs
=========================

La **précédence des opérateurs** détermine l'ordre dans lequel les opérateurs sont évalués. Les opérateurs avec la plus haute précédence sont évalués en premier.

Ainsi, l'opérateur de multiplication (« `*` ») (ayant une précédence plus haute que l'opérateur d'addition (« `+` »)) est évalué en premier et l'expression `6 * 4 + 2` renverra 26 (et pas 36).

Exemple interactif
------------------

Associativité
-------------

L'associativité détermine l'ordre dans lequel des opérateurs de même précédence sont évalués. Par exemple, considérons l'expression suivante :


```js
a OP b OP c
```


Une associativité de gauche (gauche à droite) signifie qu'elle est évaluée comme `(a OP b) OP c`, tandis qu'une associativité de droite (droite à gauche) signifie qu'elle est interprétée comme `a OP (b OP c)`. Les opérateurs d'affectation sont associatifs de droite, on peut donc écrire :


```js
a = b = 5;
```


avec le résultat attendu que `a` et `b` obtiennent la même valeur de 5. C'est parce que l'opérateur d'affectation retourne la valeur qu'il affecte. D'abord, `b` est défini à la valeur 5. Ensuite, `a` est défini avec la valeur renvoyée par `b = 5` qui est 5.

Exemples
--------


```js
3 > 2 && 2 > 1;
// renvoie true

3 > 2 > 1;
// renvoie false car 3 > 2 vaut true et que true > 1 vaut false
// En ajoutant des parenthèses, on y voit plus clair (3 > 2) > 1
```

Tableau
-------

Le tableau suivant est classé de la plus haute (19) à la plus basse (1) précédence.

| Précédence | Type d'opérateur | Associativité | Opérateurs individuels |
| --- | --- | --- | --- |
| 19 | Groupement | Non applicable | `( … )` |
| 18 | Accès à un membre | Gauche à droite | `… . …` |
| Accès à un membre calculé | `… [ … ]` |
| `new`
 (avec une liste d'arguments)
  | Non applicable | `new … ( … )` |
| Appel de fonction | Gauche à droite | `… ( … )` |
| Chaînage optionnel | `?.` |
| 17 | `new`
 (sans liste d'arguments)
  | Droite à gauche | `new …` |
| 16 | Incrémentation suffixe | Non applicable | `… ++` |
| Décrémentation suffixe | `… --` |
| 15 | NON logique (!) | Droite à gauche | `! …` |
| NON binaire (~) | `~ …` |
| Plus unaire (+) | `+ …` |
| Négation unaire (-) | `- …` |
| Incrémentation préfixe | `++ …` |
| Décrémentation préfixe | `-- …` |
| `typeof` | `typeof …` |
| `void` | `void …` |
| `delete` | `delete …` |
| `await` | `await …` |
| 14 | Exponentiation (\*\*) | Droite à gauche | `… ** …` |
| 13 | Multiplication (\*) | Gauche à droite | `… * …` |
| Division (/) | `… / …` |
| Reste (%) | `… % …` |
| 12 | Addition (+) | Gauche à droite | `… + …` |
| Soustraction (-) | `… - …` |
| 11 | Décalage binaire à gauche (<<) | Gauche à droite | `… << …` |
| Décalage binaire à droite (>>) | `… >> …` |
| Décalage binaire à droite non-signé (>>>) | `… >>> …` |
| 10 | Inférieur strict (<) | Gauche à droite | `… < …` |
| Inférieur ou égal (<=) | `… <= …` |
| Supérieur strict (>) | `… > …` |
| Supérieur ou égal (>=) | `… >= …` |
| `in` | `… in …` |
| `instanceof` | `… instanceof …` |
| 9 | Égalité faible (==) | Gauche à droite | `… == …` |
| Inégalité faible (!=) | `… != …` |
| Égalité stricte (===) | `… === …` |
| Inégalité stricte (!==) | `… !== …` |
| 8 | ET binaire (&) | Gauche à droite | `… & …` |
| 7 | OU exclusif / XOR binaire (^) | Gauche à droite | `… ^ …` |
| 6 | OU binaire (|) | Gauche à droite | `… | …` |
| 5 | ET logique (&&) | Gauche à droite | `… && …` |
| 4 | OU logique (||) | Gauche à droite | `… || …` |
| Coalescence des nuls (??) | `… ?? …` |
| 3 | Opérateur conditionnel ternaire | Droite à gauche | `… ? … : …` |
| 2 | Affectation | Droite à gauche | `… = …` |
| `… += …` |
| `… -= …` |
| `… **= …` |
| `… *= …` |
| `… /= …` |
| `… %= …` |
| `… <<= …` |
| `… >>= …` |
| `… >>>= …` |
| `… &= …` |
| `… ^= …` |
| `… |= …` |
| `… &&= …` |
| `… ||= …` |
| `… ??= …` |
| `yield` | Droite à gauche | `yield …` |
| `yield\*` | `yield* …` |
| 1 | Virgule | Gauche à droite | `… , …` |