Приоритет операторов определяет порядок, в котором операторы выполняются. Операторы с более высоким приоритетом выполняются первыми.
Распространённый пример:
3 + 4 * 5 // возвращает 23
Оператор умножения («*
») имеет более высокий приоритет, чем оператор сложения («+
») и поэтому будет выполняться первым.
Ассоциативность
Ассоциативность определяет порядок, в котором обрабатываются операторы с одинаковым приоритетом. Например, рассмотрим выражение:
a OP b OP c
Левая ассоциативность (слева-направо) означает, что оно обрабатывается как (a OP b) OP c
, в то время как правая ассоциативность (справа-налево) означает, что они интерпретируются как a OP (b OP c)
. Операторы присваивания являются право-ассоциативными, так что Вы можете написать:
a = b = 5;
с ожидаемым результатом, что a
и b
будут равны 5. Это происходит, потому что оператор присваивания возвращает тот результат, который присваивает. Сначала b
становится равным 5, затем a
принимает значение b
.
Таблица
Данная таблица упорядочена с самого высокого приоритета (19) до самого низкого (0).
Приоритет | Тип оператора | Ассоциативность | Конкретные операторы |
---|---|---|---|
19 | Группирование | неопределено | ( … ) |
18 | Доступ к элементам | слева направо | … . … |
Доступ к элементам с возможностью вычисления | слева направо | … [ … ] |
|
new (со списком аргументов) | неопределено | new … ( … ) |
|
17 | Вызов функции | слева направо | … ( … ) |
new (без списка аргументов) | справа налево | new … |
|
16 | Постфиксный инкремент | неопределено | … ++ |
Постфиксный декремент | неопределено | … -- |
|
15 | Логическое отрицание | справа налево | ! … |
Побитовое отрицание | справа налево | ~ … |
|
Унарный плюс | справа налево | + … |
|
Унарный минус | справа налево | - … |
|
Префиксный инкремент | справа налево | ++ … |
|
Префиксный декремент | справа налево | -- … |
|
typeof | справа налево | typeof … |
|
void | справа налево | void … |
|
delete | справа налево | delete … |
|
14 | Умножение | слева направо | … * … |
Деление | слева направо | … / … |
|
Остаток | слева направо | … % … |
|
13 | Сложение | слева направо | … + … |
Вычитание | слева направо | … - … |
|
12 | Побитовый сдвиг влево | слева направо | … << … |
Побитовый сдвиг вправо | слева направо | … >> … |
|
Сдвиг вправо с заполнением нулей | слева направо | … >>> … |
|
11 | Меньше | слева направо | … < … |
Меньше либо равно | слева направо | … <= … |
|
Больше | слева направо | … > … |
|
Больше либо равно | слева направо | … >= … |
|
in | слева направо | … in … |
|
instanceof | слева направо | … instanceof … |
|
10 | Равно | слева направо | … == … |
Не равно | слева направо | … != … |
|
Строго равно | слева направо | … === … |
|
Строго не равно | слева направо | … !== … |
|
9 | Побитовое «И» | слева направо | … & … |
8 | Побитовое иключающее «ИЛИ» | слева направо | … ^ … |
7 | Побитовое «ИЛИ» | слева направо | … | … |
6 | Логическое «И» | слева направо | … && … |
5 | Логическое «ИЛИ» | слева направо | … || … |
4 | Условный | справа налево | … ? … : … |
3 | Присваивание | справа налево | … = … |
… += … |
|||
… -= … |
|||
… *= … |
|||
… /= … |
|||
… %= … |
|||
… <<= … |
|||
… >>= … |
|||
… >>>= … |
|||
… &= … |
|||
… ^= … |
|||
… |= … |
|||
2 | yield | справа налево | yield … |
1 | Оператор расширения | неопределено | ... … |
0 | Запятая / Последовательность | слева направо | … , … |