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 | … , … |