# Operator precedence

Operator precedence determines the order in which operators are evaluated. Operators with higher precedence are evaluated first.

A common example:

```3 + 4 * 5 // returns 23
```

The multiplication operator ("`*`") has higher precedence than the addition operator ("`+`") and thus will be evaluated first.

## Associativity

Associativity determines the order in which operators of the same precedence are processed. For example, consider an expression:

```a OP b OP c
```

Left-associativity (left-to-right) means that it is processed as `(a OP b) OP c`, while right-associativity (right-to-left) means it is interpreted as `a OP (b OP c)`. Assignment operators are right-associative, so you can write:

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

with the expected result that `a` and `b` get the value 5. This is because the assignment operator returns the value that it assigned. First, `b` is set to 5. Then the `a` is also set to 5, the return value of `b = 5`, aka right operand of the assignment.

## Table

The following table is ordered from highest (19) to lowest (0) precedence.

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