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