MENU
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 function8
8