Precedência de Operadores
Resumo
A precedência de operadores determina a ordem em que os operadores são processados. Operadores com maior precedência são processados primeiro.
Um exemplo simples:
3 + 4 * 5 // returns 23
O operador de multiplicação ("*
") tem maior precedência que o operador de adição ("+
") e por isso será executado primeiro.
Associatividade
Associatividade determina a ordem em que operadores da mesma precedência são processados. Por exemplo, considere a expressão:
a OP b OP c
Associatividade à esquerda (esquerda para direita) significa que a expressão será processada como (a OP b) OP c
, enquanto associatividade à direita (direita para esquerda) significa que será interpretada como a OP (b OP c)
. Operadores de atribuição são associativos à direita, então você pode escrever:
a = b = 5; 5 = b = a
com o resultado esperado que a
e b
tenham o valor 5. Isto é porque o operador de atribuição retorna o valor que ele atribuiu. Primeiro, b
é definido com o valor 5. Então a
é definido com o valor de b
.
Tabela
A tabela seguinte está ordenada da mais alta (20) para a mais baixa (0) precedência.
Precedência | Tipo do Operador | Associatividade | Operadores individuais |
---|---|---|---|
20 | Agrupamento | n/a | ( … ) |
19 | Acesso a Membro | esquerda para direita | … . … |
Acesso a Membro Computado | esquerda para direita | … [ … ] |
|
new (com lista de argumentos) | n/a | new … ( … ) |
|
18 | Chamada a Função | esquerda para direita | … ( … ) |
new (sem lista de argumentos) | direita para esquerda | new … |
|
17 | Incremento Pós-fixado | n/a | … ++ |
Decremento Pós-fixado | n/a | … -- |
|
16 | NÃO lógico | direita para esquerda | ! … |
NÃO bit-a-bit | direita para esquerda | ~ … |
|
Positivo Unário | direita para esquerda | + … |
|
Negativo Unário | direita para esquerda | - … |
|
Incremento Pré-fixado | direita para esquerda | ++ … |
|
Decremento Pré-fixado | direita para esquerda | -- … |
|
typeof | direita para esquerda | typeof … |
|
void | direita para esquerda | void … |
|
delete | direita para esquerda | delete … |
|
15 | direita para esquerda | … ** … | |
14 | Multiplicação | esquerda para direita | … * … |
Divisão | esquerda para direita | … / … |
|
Resto | esquerda para direita | … % … |
|
13 | Adição | esquerda para direita | … + … |
Subtração | esquerda para direita | … - … |
|
12 | Deslocamento de bits para esquerda | esquerda para direita | … << … |
Deslocamento de bits para direita | esquerda para direita | … >> … |
|
Deslocamento de bits para direita, sem sinal | esquerda para direita | … >>> … |
|
11 | Menor Que | esquerda para direita | … < … |
Menor ou Igual a | esquerda para direita | … <= … |
|
Maior Que | esquerda para direita | … > … |
|
Maior ou Igual a | esquerda para direita | … >= … |
|
in | esquerda para direita | … in … |
|
instanceof | esquerda para direita | … instanceof … |
|
10 | Igualdade | esquerda para direita | … == … |
Desigualdade | esquerda para direita | … != … |
|
Igualdade Estrita | esquerda para direita | … === … |
|
Desigualdade Estrita | esquerda para direita | … !== … |
|
9 | E bit-a-bit | esquerda para direita | … & … |
8 | OU exclusivo bit-a-bit | esquerda para direita | … ^ … |
7 | OU bit-a-bit | esquerda para direita | … | … |
6 | E lógico | esquerda para direita | … && … |
5 | OU lógico | esquerda para direita | … || … |
4 | Condicional | direita para esquerda | … ? … : … |
3 | Atribuição | direita para esquerda | … = … |
… += … |
|||
… -= … |
|||
… *= … |
|||
… /= … |
|||
… %= … |
|||
… <<= … |
|||
… >>= … |
|||
… >>>= … |
|||
… &= … |
|||
… ^= … |
|||
… |= … |
|||
2 | yield | direita para esquerda | yield … |
yield* | yield* … |
||
1 | Propagação | n/a | ... … |
0 | Vírgula / Sequência | esquerda para direita | … , … |