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

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

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

console.log(3 + 4 * 5); // 3 + 20
// Expected output: 23

console.log(4 * 3 ** 2); // 4 * 9
// Expected output: 36

let a;
let b;

console.log((a = b = 5));
// Expected output: 5

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

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

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 … ( … )
Вызов функциислева направо… ( )
Оператор опциональной последовательности (?.)?.
16new (без списка аргументов)справа налевоnew …
15Постфиксный инкрементне определено… ++
Постфиксный декремент… --
14Логическое отрицание (!)справа налево! …
Побитовое отрицание (~)~ …
Унарный плюс+ …
Унарный минус- …
Префиксный инкремент++ …
Префиксный декремент-- …
typeoftypeof …
voidvoid …
deletedelete …
awaitawait …
13Возведение в степень (**)справа налево… ** …
12Умножение (*)слева направо… * …
Деление (/)… / …
Остаток от деления (%)… % …
11Сложение (+)слева направо… + …
Вычитание (-)… - …
10Побитовый сдвиг влево (<<)слева направо… << …
Побитовый сдвиг вправо (>>)… >> …
Сдвиг вправо с заполнением нулей (>>>)… >>> …
9Меньше (<)слева направо… < …
Меньше или равно (<=)… <= …
Больше (>)… > …
Больше или равно (>=)… >= …
in… in …
instanceof… instanceof …
8Равенство (==)слева направо… == …
Неравенство (!=)… != …
Строгое равенство (===)… === …
Строгое неравенство (!==)… !== …
7Побитовое «И» (&)слева направо… & …
6Побитовое исключающее «ИЛИ» (^)слева направо… ^ …
5Побитовое «ИЛИ» (|)слева направо… | …
4Логическое «И» (&&)слева направо… && …
3Логическое «ИЛИ» (||)слева направо… || …
Оператор нулевого слияния (??)… ?? …
2Присваиваниесправа налево… = …
… += …
… -= …
… **= …
… *= …
… /= …
… %= …
… <<= …
… >>= …
… >>>= …
… &= …
… ^= …
… |= …
… &&= …
… ||= …
… ??= …
Условный (тернарный) операторсправа налево… ? … : …
yieldсправа налевоyield …
yield*yield* …
1Запятая / Последовательностьслева направо… , …