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

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 :

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édenceType d'opérateurAssociativitéOpérateurs individuels
19GroupementNon applicable( … )
18Accès à un membreGauche à droite… . …
Accès à un membre calculé… [ … ]
new (avec une liste d'arguments) Non applicablenew … ( … )
Appel de fonctionGauche à droite… ( )
Chaînage optionnel?.
17new (sans liste d'arguments) Droite à gauchenew …
16Incrémentation suffixeNon applicable… ++
Décrémentation suffixe… --
15NON logique (!)Droite à gauche! …
NON binaire (~)~ …
Plus unaire (+)+ …
Négation unaire (-)- …
Incrémentation préfixe++ …
Décrémentation préfixe-- …
typeoftypeof …
voidvoid …
deletedelete …
awaitawait …
14Exponentiation (**)Droite à gauche… ** …
13Multiplication (*)Gauche à droite… * …
Division (/)… / …
Reste (%)… % …
12Addition (+)Gauche à droite… + …
Soustraction (-)… - …
11Décalage binaire à gauche (<<)Gauche à droite… << …
Décalage binaire à droite (>>)… >> …
Décalage binaire à droite non-signé (>>>)… >>> …
10Infé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 (!==)… !== …
8ET binaire (&)Gauche à droite… & …
7OU exclusif / XOR binaire (^)Gauche à droite… ^ …
6OU binaire (|)Gauche à droite… | …
5ET logique (&&)Gauche à droite… && …
4OU logique (||)Gauche à droite… || …
Coalescence des nuls (??)… ?? …
3Opérateur conditionnel ternaireDroite à gauche… ? … : …
2AffectationDroite à gauche… = …
… += …
… -= …
… **= …
… *= …
… /= …
… %= …
… <<= …
… >>= …
… >>>= …
… &= …
… ^= …
… |= …
… &&= …
… ||= …
… ??= …
yieldDroite à gaucheyield …
yield*yield* …
1VirguleGauche à droite… , …