Скоро мы с вами дойдём и до функций (а точнее используем их, но скоро будем и подробно разбирать), а сегодня поговорим об операторах и операндах. На самом деле мы с ними имели дело чуть ли не с первой заметки, так что ничего сложного. Когда, например, мы складывали числа, то сама операция сложения, точнее оператор «+», упс, вот уже и оператор, а числа, стало быть – операнды. В этом смысле операторы принято делить на унарные и бинарные. Тут тоже всё просто. Если возле оператора есть только один операнд, то оператор называют унарным. Если операндов два – перед нами бинарный оператор.
Оператор «-», например, бывает унарным, если находится перед числом. В этом случае он меняет знак числа на противоположный.
let a = 5;
a = -a; // знак сменили на противоположный
alert('Применили унарный оператор "-". a = ' + a);
А может быть и бинарным, если это обычное вычитание. Хотя вычитание не работает со строками.
let x = 24.3;
let y = x - 5;
alert ('Обычное вычитание: ' + x + ' - 5 ' + ' = ' + y);
Сложение, кстати, тоже бинарный оператор. Вот тут, операндами могут выступать как числа, так и строки, с этим мы сталкивались в прошлой заметке о преобразовании типов. Тогда же и там же мы с вами столкнулись с интересным явлением, если у оператора «+» один из операндов – строка, то и результат такого «сложения» тоже будет строкой, на каком бы месте эта строка не находилась. Давайте в этом убедимся при помощи ещё одного оператора «typeof». У него есть форма записи и в виде функции, но я привык использовать его как унарный оператор. Пример:
a = 34;
let s = 34 + '12';
alert('Тип переменной s = ' + typeof s + ', а значение ' + a + ' + "12" = ' + s);
Если typeof записывать как функцию и передавать ей аргумент в скобках – результат будет аналогичным, так что используйте как больше нравится. Кроме того, когда складывая строки, вы будете передавать не представление числа в строке, как в последнем примере, а слова или фразы, вам придётся самим следить за пробелами. Напрмер, сложение двух слов просто «слепит» эти слова и о пробеле, если он нужен, думать нужно самим программистам.
a = 'Дядя';
x = 'Вова';
s = a + x;
alert('Так получится: ' + s);
s = a + ' ' + x;
alert('Так - куда лучше: ' + s);
Приоритеты
А вот ещё пара примеров. Операторы, если подряд идёт один и тот же – выполняются слева направо и возможен казус. Тут уже всё зависит от порядка операндов. Если вначале идут два числа, то они будут сложены как числа и только потом к ним в конец добавится строка. А как думаете, что будет, если строку поместить, скажем, на второе место? Попробуйте самостоятельно.
alert(3 + 4 +'6');
Про то, как работает оператор деления, даже если одним из операндов выступает строковое представление числа – мы выяснили в прошлой заметке, рекомендую на неё взглянуть подробнее.
Не поверите, но и сложение может быть унарным. Что оно делает? А выполните такой вот код:
a = true;
alert(+a);
alert(+'');
Оказывается унарный плюс переводит в число, тот операнд, что за ним следует, ну а само преобразование происходит по правилам из всё той же прошлой заметки и эквивалентно использованию функции Number(…).
Парой-тройкой примеров выше мы смотрели как выполняются операторы, если это только сложение. А кто мне скажет, каков будет результат примера:
alert(2 + 2 * 3);
Если из школьной программы вспомнить о приоритетах арифметических операций, то становится понятным, почему сначала были умножены два на три, а затем только проведено сложение. Но, увы, и тут не всё гладко. Если в качестве операндов выступят только цифры два… Проверьте сами – всё не так очевидно, как бы хотелось.
Впрочем, приоритеты унарных операций выше бинарных, затем умножение и деление, потом сложение и вычитание, а выше всех – скобки, ну а операторы одного приоритета исполняются слева направо.
С момента знакомства с переменными мы пользовались оператором присваивания и даже не обратили внимания. Знакомьтесь – «=» это привычный знак равенства. Что в нём может быть такого необычного? А как вам такая запись:
a = x = y = 5.3
alert('a = ' + a);
alert('x = ' + x);
alert('y = ' + y);
Подобной записью можно пользоваться, когда сразу нескольким переменным мы собираемся присвоить одно и то же значение. Она экономит пространство, однако, выглядит чуть менее наглядно, чем три обычных оператора. Впрочем, можете использовать, если она вас не смущает.
Есть так же краткая форма записи для увеличения и уменьшения чисел в переменных.
a = 10;
a = a + 1; // обычная форма записи для увеличения числа на 1
a ++; // краткая форма для того же действия
alert(a);
a--; // а так уменьшают числа
Обратите внимание, между переменной и двумя плюсами не принято писать пробел, равно как и при уменьшении перед минусами, хотя вообще-то ошибки не произойдёт. Со временем мы рассмотрим разницу, когда операторы «++» и «--» находятся не после, а перед числом. Впереди ещё много интересного.
Добьём работу с числами. Бинарный оператор «**» возводит левый операнд в степень равную правому операнду, но работает это только для натуральных операндов. «%» возвращает целочисленный остаток от деления левого операнда на правый.
alert('2 в 4 степени = ' + 2 ** 4);
alert('Остаток от деления 15 на 4 = ' + 15 % 4);
Что ж, я притомился и прочие операторы, особенно те, что работают с логическими значениями, позвольте рассмотреть в следующий раз. А покамест напоминаю, что для вас я создал репозиторий на gitHub, откуда можно скачивать материалы наших занятий.