Précédence des opérateurs - JavaScript | MDN
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
console.log(3 + 4 * 5); // 3 + 20
// Expected output: 23
console.log(4 * 3 ** 2); // 4 * 9
// Expected output: 36
let a;
let b;
console.log((a = b = 5));
// Expected output: 5
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 :
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 :
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 | … , … |