This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

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

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

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

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 … ( … )
Вызов функции слева направо … ( )
Оператор опциональной последовательности (?.) ?.
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 Запятая / Последовательность слева направо … , …