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

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

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

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

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

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