Базовые операторы, математика
Многие операторы знакомы нам ещё со школы: сложение +
, умножение *
, вычитание -
и так далее.
В этой главе мы начнём с простых операторов, а потом сконцентрируемся на специфических для JavaScript аспектах, которые не проходят в школьном курсе арифметики.
Термины: «унарный», «бинарный», «операнд»
Прежде, чем мы двинемся дальше, давайте разберёмся с терминологией.
- Операнд – то, к чему применяется оператор. Например, в умножении
5 * 2
есть два операнда: левый операнд равен5
, а правый операнд равен2
. Иногда их называют «аргументами» вместо «операндов». - Унарным называется оператор, который применяется к одному операнду. Например, оператор унарный минус
"-"
меняет знак числа на противоположный:let x = 1; x = -x; alert( x ); // -1, применили унарный минус
- Бинарным называется оператор, который применяется к двум операндам. Тот же минус существует и в бинарной форме:
let x = 1, y = 3; alert( y - x ); // 2, бинарный минус вычитает значения
. Формально, в последних примерах мы говорим о двух разных операторах, использующих один символ: оператор отрицания (унарный оператор, который обращает знак) и оператор вычитания (бинарный оператор, который вычитает одно число из другого).
Математика
Поддерживаются следующие математические операторы:
- Сложение
+
, - Вычитание
-
, - Умножение
*
, - Деление
/
, - Взятие остатка от деления
%
, - Возведение в степень
**
.
Взятие остатка %
Оператор взятия остатка %
, несмотря на обозначение, никакого отношения к процентам не имеет.
Результат a % b
– это остаток от целочисленного деления a
на b
.
Например:
alert( 5 % 2 ); // 1, остаток от деления 5 на 2
alert( 8 % 3 ); // 2, остаток от деления 8 на 3
Возведение в степень **
В выражении a ** b
оператор возведения в степень умножает a
на само себя b
раз.
Например:
alert( 2 ** 2 ); // 4 (2 умножено на себя 2 раза)
alert( 2 ** 3 ); // 8 (2 * 2 * 2, 3 раза)
alert( 2 ** 4 ); // 16 (2 * 2 * 2 * 2, 4 раза)
Математически, оператор работает и для нецелых чисел. Например, квадратный корень является возведением в степень 1/2
:
alert( 4 ** (1/2) ); // 2 (степень 1/2 эквивалентна взятию квадратного корня)
alert( 8 ** (1/3) ); // 2 (степень 1/3 эквивалентна взятию кубического корня)
Сложение строк при помощи бинарного +
Давайте рассмотрим специальные возможности операторов JavaScript, которые выходят за рамки школьной арифметики.
Обычно при помощи плюса '+'
складывают числа.
Но если бинарный оператор '+'
применить к строкам, то он их объединяет в одну:
let s = "моя" + "строка";
alert(s); // моястрока
Обратите внимание, если хотя бы один операнд является строкой, то второй будет также преобразован в строку.
Например:
alert( '1' + 2 ); // "12"
alert( 2 + '1' ); // "21"
Как видите, не важно, первый или второй операнд является строкой.
Вот пример посложнее:
alert(2 + 2 + '1' ); // будет "41", а не "221"
Здесь операторы работают один за другим. Первый +
складывает два числа и возвращает 4
, затем следующий +
объединяет результат со строкой, производя действие 4 + '1' = 41
.
Сложение и преобразование строк — это особенность бинарного плюса +
. Другие арифметические операторы работают только с числами и всегда преобразуют операнды в числа.
Например, вычитание и деление:
alert( 6 - '2' ); // 4, '2' приводится к числу
alert( '6' / '2' ); // 3, оба операнда приводятся к числам
Приведение к числу, унарный +
Плюс +
существует в двух формах: бинарной, которую мы использовали выше, и унарной.
Унарный, то есть применённый к одному значению, плюс +
ничего не делает с числами. Но если операнд не число, унарный плюс преобразует его в число.
Например:
// Не влияет на числа
let y = -2;
alert( +y ); // -2
// Преобразует не числа в числа
alert( +true ); // 1
alert( +"" ); // 0
На самом деле это то же самое, что и Number(...)
, только короче.
Необходимость преобразовывать строки в числа возникает очень часто. Например, обычно значения полей HTML-формы — это строки. А что, если их нужно, к примеру, сложить?
Бинарный плюс сложит их как строки:
let apples = "2";
let oranges = "3";
alert( apples + oranges ); // "23", так как бинарный плюс объединяет строки
Поэтому используем унарный плюс, чтобы преобразовать к числу:
let apples = "2";
let oranges = "3";
// оба операнда предварительно преобразованы в числа
alert( +apples + +oranges ); // 5
// более длинный вариант
// alert( Number(apples) + Number(oranges) ); // 5
С точки зрения математика, такое изобилие плюсов выглядит странным. Но с точки зрения программиста тут нет ничего особенного: сначала выполнятся унарные плюсы, которые приведут строки к числам, а затем бинарный '+'
их сложит.
Почему унарные плюсы выполнились до бинарного сложения? Как мы сейчас увидим, дело в их приоритете.
Приоритет операторов
В том случае, если в выражении есть несколько операторов – порядок их выполнения определяется приоритетом, или, другими словами, существует определённый порядок выполнения операторов.
Из школы мы знаем, что умножение в выражении 1 + 2 * 2
выполнится раньше сложения. Это как раз и есть «приоритет». Говорят, что умножение имеет более высокий приоритет, чем сложение.
Скобки важнее, чем приоритет, так что, если мы не удовлетворены порядком по умолчанию, мы можем использовать их, чтобы изменить приоритет. Например, написать (1 + 2) * 2
.
В JavaScript много операторов. Каждый оператор имеет соответствующий номер приоритета. Тот, у кого это число больше, – выполнится раньше. Если приоритет одинаковый, то порядок выполнения – слева направо.
Отрывок из таблицы приоритетов (нет необходимости всё запоминать, обратите внимание, что приоритет унарных операторов выше, чем соответствующих бинарных):
Приоритет | Название | Обозначение |
---|---|---|
… | … | … |
17 | унарный плюс | + |
17 | унарный минус | - |
16 | возведение в степень | ** |
15 | умножение | * |
15 | деление | / |
13 | сложение | + |
13 | вычитание | - |
… | … | … |
3 | присваивание | = |
… | … | … |
Так как «унарный плюс» имеет приоритет 17
, который выше, чем 13
у «сложения» (бинарный плюс), то в выражении "+apples + +oranges"
сначала выполнятся унарные плюсы, а затем сложение.