Урок 3

Урок 3. Основные операторы языка JavaScript

На данном уроке мы рассмотрим:

  1. Операторы

    • Унарные и бинарные операторы

    • Арифметические операторы

    • Логические значения

    • Сравнение строк

    • Сравнение с null и undefined

    • Присваивание

    • Приоритет

    • Инкремент и декремент: ++, --

    • Побитовые операторы

    • Вызов операторов с присваиванием

Операторы

JavaScript предлагает большое количество мощных операторов, начиная с арифметических, строковых и логических и заканчивая операторами присваивания, сравнения и т.д.

Различные типы операторов воспринимают разное количество операндов.

Унарные и бинарные операторы

Унарные операторы, к примеру операторы инкремента (a++) или изменения знака числа (-a), воспринимают один операнд.

Унарным называется оператор, который применяется к одному выражению. Например, оператор унарный минус "-" меняет знак числа на противоположный:

var x=5;

alert( -x); // -5, унарный минус


Бинарные операторы, представленные основной массой операторов JavaScript (включая операторы сложения, вычитания, умножения и деления), воспринимают два операнда.

Бинарным называется оператор, который применяется к двум операндам. Тот же минус существует и в бинарной форме:

var a=2, b=5;

alert( b-a); // 3, бинарный минус


Арифметические операторы

Базовые арифметические операторы знакомы нам с детства: это плюс +, минус -, умножить *, поделить /.

Например:

alert (2+2);


Более редкий арифметический оператор % интересен тем, что никакого отношения к процентам не имеет. Его результат a % b — это остаток от деления a на b.

Например:

alert(7 % 2); // 1, остаток от деления 7 на 2

Если бинарный оператор + применить к строкам, то он их объединяет в одну:

var x="my" + "symbol";

alert(x); // mysymbol


Запомните!

Если хотя бы один аргумент является строкой, то второй будет также преобразован к строке!

Причем не важно, справа или слева находится операнд-строка, в любом случае не строковый аргумент будет преобразован.

Например: alert('1'+2); // '12'

alert(2 +'1'); //21

Это приведение к строке — особенность бинарного оператора "+". Остальные арифметические операторы работают только с числами и всегда приводят аргументы к числу.

alert('1'-2); // -1

alert(8/'4'); // 2

Многие операторы сравнения знакомы нам со школы:

  • Больше/меньше: a > b, a < b

  • Больше/меньше или равно: a >= b, a <= b

  • Равно: a == b

Для сравнения используется два символа равенства '='. Один символ a = b означал бы присваивание.

«Не равно». В школе он пишется как ≠, в JavaScript — знак равенства с восклицательным знаком перед ним !=.

Логические значения

Как и другие операторы, сравнение возвращает значение. Это значение имеет специальный логический тип.

Существует всего два логических значения:

true — имеет смысл «да», «верно», «истина».

false — означает «нет», «неверно», «ложь».

Например:

var a=2;

var b=1;

c=a>b;

document.write(c+" a больше b");

или

var a=2;

var b=1;

c=a==b;

document.write(c+" a больше b");

Сравнение строк

Строки сравниваются побуквенно:

alert('Б' > 'А')// true

Буквы сравниваются в алфавитном порядке. Какая буква в алфавите позже — та и больше.

Аналогом «алфавита» во внутреннем представлении строк служит кодировка, у каждого символа — свой номер (код). JavaScript использует кодировку Unicode. При этом сравниваются численные коды символов.

В кодировке Unicode обычно код у строчной буквы больше, чем у прописной. Для корректного сравнения символы должны быть в одинаковом регистре.

Сравнение осуществляется как в телефонной книжке или в словаре. Сначала сравниваются первые буквы, потом вторые, и так далее, пока одна не будет больше другой.

  1. Если первая буква одной строки больше — значит первая строка больше, независимо от остальных символов:
    alert('Буква' > 'Абрикос');

  2. Если одинаковы — сравнение идёт дальше. Здесь оно дойдёт до третьей буквы:
    alert( 'Вася '> 'Ваня'); // true, так как "с" > "н"

  3. При этом любая буква больше отсутствия буквы:
    alert('Строка' > ' Стро'); // true, так как "к" больше чем "ничего".

Такое сравнение называется лексикографическим.

Строгое равенство

Для проверки равенства без преобразования типов используются операторы строгого равенства === (тройное равно) и !==.

Они сравнивают без приведения типов. Если тип разный, то такие значения всегда неравны (строго):

alert( 0= = = false); // false, так как различные типы.

Сравнение с null и undefined

Интуитивно кажется, что null/undefined эквивалентны нулю, но это не так! Они ведут себя по-другому.

Запомните! Значения null и undefined равны == друг другу и не равны чему бы то ни было ещё. Это жёсткое правило буквально прописано в спецификации языка. При преобразовании в число null становится 0, а undefined становится NaN.

Присваивание

Оператор присваивания выглядит как знак равенства =:

var x=2+3;

document.write(x); // 5

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

Возможно присваивание по цепочке:

var x,y,x;

x=y=z=1+1;

alert(x); // 2

alert(y); // 2

alert(z); //2

Такое присваивание работает справа-налево, то есть сначала вычисляется самое правое выражение 1+1, присвоится в z, затем выполнится y = z и, наконец, x = y.

Приоритет

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

Из школы мы знаем, что умножение в выражении 2 * 2 + 1 выполнится раньше сложения, т.к. его приоритет выше, а скобки явно задают порядок выполнения. Но в JavaScript — гораздо больше операторов, поэтому существует целая таблица приоритетов.

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

Посмотрим в действии.

В выражении x = 2 * 2 + 1 есть три оператора: присвоение =, умножение * и сложение +. Приоритет умножения * равен 5, оно выполнится первым, затем произойдёт сложение +, у которого приоритет 6, и после них — присвоение =, с приоритетом 17.

Инкремент и декремент: ++, --

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

  1. Инкремент ++ увеличивает на 1:
    var i=2;
    i++;
    alert(i); // 3

Декремент -- уменьшает на 1:

var i=2;

i--;

alert(i); // 1

Инкремент/декремент можно применить только к переменной. Код 5++ даст ошибку.

Вызывать эти операторы можно не только после, но и перед переменной: i++ (называется «постфиксная форма») или ++i («префиксная форма»).

Обе эти формы записи делают одно и то же: увеличивают на 1. Инкремент/декремент можно использовать в любых выражениях. При этом он имеет более высокий приоритет и выполняется раньше, чем арифметические операции:

var i=2;

alert(2* ++i); // 6

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

Поддерживаются следующие побитовые операторы:


ызов операторов с присваиванием

Часто нужно применить оператор к переменной и сохранить результат в ней же.

Например:

var n=2;

n=n+5;

n=n*3;

Эту запись можно укоротить при помощи совмещённых операторов: +=, -=, *=, /=, >>=, <<=, >>>=, &=, |=, ^=.

Вот так:

var n=2;

n +=5; // сейчас n=7 ( работает как n=n+5)

document.write(n+' ');

n *=3; // сейчас n=21 (работает как n=n*3)

document.write(n+' ');

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

Вопросы и задания!

  1. Объявите 2 переменные а и b. Напишите программу:

    • сложения

    • вычитания

    • умножения

    • деления

    • деления с остатком

  2. Выводите ответы с помощью функции alert, как было приведено на примерах.

  3. Найдите значения выражений:

    • (20*y+15*x)/3+230 при x=3, y=20

    • (238*x/8+25*y/5 - 430)*6 при x=16, y=20

  4. Выведите результаты.

  5. Вычислите значения х=2, у=3 после использования постфиксной и префиксной форм инкремента и декремента. Выведите значения. Объясните зачем получаются такие ответы.

  6. Напишите код сравнения строк:

    • "Airat" и "Ainaz"

    • "Rashit" и "Rishat"

    • "group" и "friend"