Приоритет операторов

Приоритет операторов определяет порядок, в котором операторы выполняются. Операторы с более высоким приоритетом выполняются первыми.

Интерактивный пример

Ассоциативность

Ассоциативность определяет порядок, в котором обрабатываются операторы с одинаковым приоритетом. Например, рассмотрим выражение:

a OP b OP c

Левая ассоциативность (слева направо) означает, что оно обрабатывается как (a OP b) OP c, в то время как правая ассоциативность (справа налево) означает, что они интерпретируются как a OP (b OP c). Операторы присваивания являются право-ассоциативными, так что вы можете написать:

js
a = b = 5;

с ожидаемым результатом, что a и b будут равны 5. Это происходит, потому что оператор присваивания возвращает тот результат, который присваивает. Сначала b становится равным 5, затем a принимает значение b.

Примеры

js
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 Запятая / Последовательность слева направо … , …