Precedence & Associativity

Precedence determines the order in which operators are evaluated in an expression.
For example, 3 + 4 * 5 returns 23, because * is evaluated before +.
* is said to have higher precedence than +.

Associativity determines the order of evaluation for operators of the same precedence.
For example, a = b = c will assign both variables a and b the value of c, because b = c will be evaluated first, as = has right-to-left associativity.

Pr. Operator type Ass. Syntax
21 Grouping n/a ( ... )
20 Member Access LTR ... . ...
Computed Member Access LTR ... [ ... ]
new (with argument list) n/a new ... ( ... )
Function Call LTR ... ( ... )
19 new (without argument list) RTL new ...
18 Postfix Increment n/a ... ++
Postfix Decrement n/a ... --
17 Logical NOT RTL ! ...
Bitwise NOT RTL ~ ...
Unary Plus RTL + ...
Unary Negation RTL - ...
Prefix Increment RTL ++ ...
Prefix Decrement RTL -- ...
typeof RTL typeof ...
void RTL void ...
delete RTL delete ...
await RTL await ...
16 Exponentiation RTL ... ** ...
15 Multiplication LTR ... * ...
Division LTR ... / ...
Remainder LTR ... % ...
14 Addition LTR ... + ...
Subtraction LTR ... - ...
13 Bitwise Left Shift LTR ... << ...
Bitwise Right Shift LTR ... >> ...
Bitwise Unsigned Right Shift LTR ... >>> ...
12 Less Than LTR ... < ...
Less Than Or Equal LTR ... <= ...
Greater Than LTR ... > ...
Greater Than Or Equal LTR ... >= ...
in LTR ... in ...
instanceof LTR ... instanceof ...
11 Equality LTR ... == ...
Inequality LTR ... != ...
Strict Equality LTR ... === ...
Strict Inequality LTR ... !== ...
10 Bitwise AND LTR ... & ...
9 Bitwise XOR LTR ... ^ ...
8 Bitwise OR LTR ... | ...
7 Logical AND LTR ... && ...
6 Logical OR LTR ... || ...
5 Nullish coalescing operator LTR ... ?? ...
4 Conditional RTL ... ? ... : ...
3 Assignment RTL ... = ...
... += ...
... -= ...
... **= ...
... *= ...
... /= ...
... %= ...
... <<= ...
... >>= ...
... >>>= ...
... &= ...
... ^= ...
... |= ...
2 yield RTL yield ...
yield* RTL yield* ...
1 Spread n/a ... ...
0 Comma / Sequence LTR ... , ...

console.log(3 * (5 + 2));
console.log(2 ** 2 ** 2 * 3 % 10);

21 8

Note that an assignment statement returns the value being assigned. Because of the right-to-left associativity of some operators, you can declare multiple variables/functions using the operators continuously in a row:


var x = y = 7;
console.log(z = x += 1);
f = a => b => x;
console.log(f()()); // f() and 'a' return a function

8 8