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

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

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

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

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

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