Приоритеты операторов в JavaScript
easy

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

Вспоминаем школьную математику и расставляем скобки

Оператор — это символ или группа символов, которые представляют какую-то операцию: арифметическую, логическую, присваивания и так далее. В математике самые известные операторы — это знаки плюса, минуса, умножения и деления. В JavaScript тоже есть свои операторы, и точно так же, как и в математике, в программировании есть определённый порядок, в котором все эти операторы выполняются. Если не знать приоритета операций, можно написать неправильный код, который будет делать не то, что задумал программист. Чтобы этого не было, расскажем про основные операторы в JS и их приоритеты.

Операторы и операнды

Сразу разберёмся с базовыми понятиями: оператор и операнд. Чтобы было проще, покажем это на простом примере:

2 + 3

Здесь знак сложения (плюс) — это оператор, а числа, которые мы складываем (2 и 3), — это операнды. Ещё можно запомнить так: оператор — это то, что мы делаем, а операнд — с чем мы это делаем.

В JS есть разные типы операторов, мы поговорим про те, которые используются чаще всего.

Математические операторы:

  • Инкремент: ++
  • Декремент: --
  • Возведение в степень: **
  • Взятие остатка от деления: %
  • Умножение: *
  • Деление: /
  • Сложение: +
  • Вычитание: -

Логические операторы:

  • ! (НЕ)
  • && (И)
  • || (ИЛИ)

Отдельно рассмотрим оператор последовательного присваивания:

  • a = b = c

Если взять выражение console.log(8 + 2), то + в нём будет оператором сложения, а числа 8 и 2 — операндами. Действие, которое оператор производит над операндами, — это операция. 

В зависимости от количества операндов операции бывают:

  1. унарные — когда используется только один операнд; 
  2. бинарные — когда операндов два; 
  3. и тернарные — когда их три.

В нашем примере (8 + 2) — это бинарная операция, поскольку оператор + действует на два операнда: 8 и 2.

Хорошим тоном при написании кода считается отбивать операторы от операндов пробелами: когда операторов много, такой код легче воспринимать.

Общий приоритет операторов

Приоритет определяет то, в какой последовательности должны выполняться операции. В JS всё так же, как и в обычной математике, и операторы выполняются в следующем порядке:

  1. Операторы инкремента ++ и декремента --
  2. Возведение в степень **
  3. Умножение *, деление /, взятие остатка от деления %
  4. Сложение +, вычитание -
  5. Логические операторы НЕ (!), И (&&), ИЛИ (||)
  6. Последовательное присваивание = =

Если подряд идут операции с одинаковым приоритетом, они выполняются слева направо. Операция последовательного присваивания выполняется справа налево.

Инкремент и декремент

Инкремент ++ и декремент -- используют для увеличения или уменьшения значения своего операнда на единицу. При этом есть разница, стоят ли эти два знака до или после переменной. Если до, то сначала значение переменной увеличится (или уменьшится) на единицу, а потом будет выполняться всё остальное. А если они стоят после переменной, то сначала посчитается всё выражение и только потом значение переменной увеличится на единицу.

Ставим инкремент в начало и смотрим на результат. По правилам мы сначала увеличим значение переменной, а потом будет происходить всё остальное:

let x = 0;
console.log(++x + 2);

Ставим инкремент в начало и смотрим на результат

Логика такая:

  1. Мы задали переменную x.
  2. Сразу увеличили значение переменной на единицу, потому что инкремент стоит до переменной. Теперь в переменной X будет значение 1.
  3. Прибавили к ней два обычным сложением — 1 + 2 = 3. Этот результат и появился на экране.

Теперь проверим, как работает инкремент после переменной:

let x = 0;
console.log(x++ + 2);

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

Вот что произошло:

  1. Мы задали переменную x.
  2. Прибавили к ней два обычным сложением — 0 + 2 = 2. Этот результат и появился на экране.
  3. И только потом увеличили значение переменной на единицу. Теперь в переменной X будет значение 1.

Возведение в степень

Следующий оператор — возведение в степень **. Он выше всех остальных арифметических операций:

console.log(2 ** 3 * 2)

В примере сначала возводим 2 в степень 3, а затем умножаем на 2:

  1. 2³ = 8
  2. 8 × 2 = 16

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

Умножение, деление и взятие остатка

Обозначаются они так: умножение *, деление / и взятие остатка от деления %. Эти операции выполняются до сложения или вычитания:

console.log(48 / 6 * 2);

Здесь идут две операции, имеющие одинаковый приоритет. Поэтому сначала 48 делим на 6 и получаем 8, а потом умножаем результат на 2, что даёт 16.

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

Оператор взятия остатка от деления имеет тот же приоритет, что умножение и деление.

console.log(10 % 4 * 2);

Решаем пример слева направо: сначала 10 делим на 4 с остатком, затем 2 умножаем на 2, что даёт 4.

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

Сложение и вычитание

Сложение + и вычитание - имеют наименьший приоритет.

console.log(20 - 2 + 2 * 2 ** 2);

  1. Выполняем возведение в степень 2 ** 2 = 4.
  2. Затем умножаем 2 * 4 = 8.
  3. После этого слева направо выполняем операции вычитания и сложения. Сначала 20 - 2 = 18, затем 18 + 8 = 26:

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

Приоритеты логических операторов

Логические операторы используются для проверки и определения истинности между двумя или более операндами. 

  1. ! — «НЕ» (отрицание). Если операнд истинен, то оператор НЕ превращает его в ложный, и наоборот. Имеет самый высокий приоритет.
  2. && — «И» (в матлогике это называют конъюнкцией). Всё выражение считается истинным только в том случае, когда истинен каждый операнд. Выполняется только после всех операций НЕ.
  3. || — «ИЛИ» (дизъюнкция). Выражение считается истинным, если истинен хотя бы один операнд. Имеет самый низкий приоритет среди логических операторов.

Разберём приоритетность на вот таком примере:

console.log(true || false && !false);

  1. Сначала выполнится оператор НЕ, превращая false в true
  2. Затем выполнится оператор И: false && true даёт false
  3. Наконец, выполняется оператор ИЛИ: true || false даёт true.

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

Логические операторы имеют более низкий приоритет, чем арифметические, поэтому выполняются после арифметических действий

let a = 5, b = 10, c = 15;
console.log(a + b * c > 50 || b - c > 0);

  1. Задаём три переменные.
  2. Сначала делаем умножение b * c, получаем 150.
  3. Затем складываем a + 150 = 155.
  4. После этого сравниваем 155 > 50, получаем true.
  5. Во второй части выражения получаем -5.
  6. Сравниваем его с нулём и получаем false.
  7. И в самом конце производим операцию ИЛИ: (true || false), которая возвращает true.

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

В этом примере мы также использовали операторы сравнения. Они имеют средний приоритет: выше, чем у логических операторов, но ниже, чем у арифметических.

Приоритет оператора присваивания подряд

Оператор присваивания подряд используется для установки значения переменной или свойства объекта. Его можно использовать последовательно, что позволяет одновременно присвоить одно и то же значение нескольким переменным. Выполняется справа налево.

Оператор присваивания (=) имеет один из самых низких приоритетов среди всех операторов и выполняется последним:

let a, b, c;
a = b = c = 10;
console.log(a, b, c);

  1. Задаём три переменные.
  2. Последовательно присваиваем им значение.
  3. Сначала переменной c присваивается значение 10.
  4. Затем результат этого присваивания используется для выражения b = c, что означает присваивание b значения 10.
  5. Наконец, a = b присваивает переменной a значение 10.

Приоритет оператора присваивания подряд

Теперь объединим все операторы и посмотрим, как они выполняются:

let a, b, c, d;
a = b = c = 10 + 5;
d = (b = b + 5) || (c = c + 10);
console.log(a, b, c, d);

Во второй строке сначала выполняется сложение, а затем последовательное присвоение. 

В выражении b = b + 5 выполняется первым b + 5, а затем b присваивается значение 20. Поскольку левая сторона оператора ИЛИ уже истинна (20), то правая сторона (c = c + 10) не выполняется. Наконец, d присваивается значение левой части выражения после присваивания: 20.

Таким образом, мы получаем:

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

Как переопределить приоритет 

Иногда вычисления нужно делать в порядке, отличном от стандартного приоритета. Тогда приоритет задаётся круглыми скобками, точно так же, как в школе:

(2 + 2) * 2

То, что в скобках, вычисляется в первую очередь. Затем слева направо вычисляется всё остальное: сначала умножение и деление, потом сложение и вычитание.

Скобки можно ставить вокруг любой операции. Они могут вкладываться друг в друга сколько угодно раз:

console.log(7 * 3 + (4 / 2) - (8 + (2 - 1)));

  1. Сначала выполняются операции в скобках на самом низком уровне вложенности (4 / 2) и (2 - 1). 
  2. Затем вычисляется получившееся выражение 7 * 3 + 2 - (8 + 1). 
  3. Снова выполняются скобки, а затем операторы в порядке приоритета: умножение, сложение и вычитание.

Как переопределить приоритет

А ещё можно расставить скобки, чтобы выражение было проще воспринимать визуально, но при этом приоритет не менялся.

Было так:

console.log(8 / 2 + 5 - -3 / 2);

А стало так:

console.log(((8 / 2) + 5) - (-3 / 2)); 
Как переопределить приоритет

Логические операторы также можно комбинировать в любом количестве и любой последовательности:

let a = true, b = false, c = true;
console.log((a || b) && c); 

Поскольку оператор ИЛИ в скобках, то (a || b) выполняется первым, а уже потом выполняется оператор И.

Как переопределить приоритет

В сложных логических выражениях, где используются одновременно && и ||, лучше использовать скобки для явного указания порядка операций, чтобы избежать путаницы в логике программы. 

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Маша Климентьева

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
easy