Глиф Учебники

Урок 3. Операторы и сравнение: == и ===

Курс «JavaScript» · урок 3 из 10 · 4 минуты чтения

Оператор — значок действия над значениями: + складывает, > сравнивает, === проверяет равенство. Значения, над которыми действует оператор, называют операндами. В этом уроке — операторы, без которых не обходится ни одна программа, и главная ловушка новичков: разница между == и ===.

Арифметика

JavaScript
console.log(7 + 2);
console.log(7 - 2);
console.log(7 * 2);
console.log(7 / 2);
console.log(7 % 2);
console.log(2 ** 10);
Вывод
9
5
14
3.5
1
1024

Порядок действий — как в математике: сначала **, потом *, /, %, потом + и -. Скобки меняют порядок: 2 + 2 * 2 — это 6, а (2 + 2) * 2 — 8.

Сокращённая запись

Изменить значение переменной на месте можно короче:

JavaScript
let score = 10;
score += 5;
score -= 3;
score *= 2;
score++;
console.log(score);
Вывод
25

score += 5 — то же, что score = score + 5. Так же работают -=, *=, /=. score++ увеличивает значение на единицу, score-- — уменьшает.

Строки и плюс

+ со строкой не складывает, а склеивает: если хотя бы один операнд — строка, второй тоже превращается в строку. Остальные арифметические операторы, наоборот, превращают строки в числа.

JavaScript
console.log("5" + 3);
console.log(5 + 3 + "1");
console.log("1" + 5 + 3);
console.log("5" - 3);
console.log("5" * "2");
console.log("абв" * 2);
Вывод
53
81
153
2
10
NaN

Выражение считается слева направо: в 5 + 3 + "1" сначала 5 + 3 — это 8, потом 8 + "1" — "81". А в "1" + 5 + 3 строка стоит первой, и всё дальше склеивается.

число строка 5 + 3 + "1" сложение 8 + "1" склейка "81" "1" + 5 + 3 склейка "15" + 3 склейка "153" "5" - 3 минус переводит строку в число 2
Выражение считается слева направо: в 5 + 3 + "1" числа сначала складываются в 8, а потом склеиваются в "81"; в "1" + 5 + 3 выходит "153"; минус же переводит "5" в число и даёт 2.

Эта ловушка встречается постоянно: значение из поля формы или из prompt() — всегда строка, и "2" + "2" даёт "22". Перед сложением строку переводят в число: Number("2") + Number("2") — это 4. Подробно — в справке Как перевести строку в число.

Сравнение

Операторы >, <, >=, <= сравнивают и возвращают true или false. Числа сравниваются как числа, а строки — посимвольно, по кодам символов. Это похоже на порядок слов в словаре, но не совсем:

JavaScript
console.log(10 > 9);
console.log("10" > "9");
console.log("арбуз" < "банан");
console.log("Яблоко" < "яблоко");
Вывод
true
false
true
true

"10" > "9" — false: при сравнении строк первым сравнивается первый символ, а "1" стоит раньше "9". Большие буквы идут раньше маленьких, поэтому "Яблоко" < "яблоко". Если сравниваете числа, которые пришли строками, сначала переведите их в числа.

== и ===

Равенство проверяют два оператора:

JavaScript
console.log(5 === "5");
console.log(5 == "5");
console.log(0 == "");
console.log(0 == "0");
console.log("" == "0");
console.log(null == undefined);
console.log(null === undefined);
console.log(NaN === NaN);
Вывод
false
true
true
true
false
true
false
false

Посмотрите на три строки посередине: 0 равен и "", и "0", а "" и "0" друг другу не равны. С == такие сюрпризы неизбежны. Поэтому правило: всегда пишите === и !== (строгое «не равно»). Тогда сравнение делает ровно то, что написано.

=== строгое: тип и значение 5 === "5" false число и строка — разные типы == нестрогое: приводит типы 5 == "5" true "5" сначала превращается в 5 сравнения через == true true false 0 "" "0"
=== требует совпадения типа и значения, поэтому 5 === "5" — false, а == приводит типы: 5 == "5" — true, 0 равен и "", и "0", но "" и "0" друг другу не равны.

Две особые пары:

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

JavaScript
const age = 20;
const hasTicket = false;

console.log(age >= 18 && hasTicket);
console.log(age >= 18 || hasTicket);
console.log(!hasTicket);
Вывод
false
true
true

У && и || есть особенность: они возвращают не обязательно true или false, а одно из значений операндов. a || b возвращает a, если оно «истинное», иначе b. Этим пользуются, чтобы подставить значение по умолчанию. Но «ложными» считаются и 0, и пустая строка — и тут на помощь приходит ??.

Оператор ??

a ?? b возвращает b, только если a — null или undefined. Ноль и пустая строка остаются как есть:

JavaScript
const count = 0;
const title = null;

console.log(count || 10);
console.log(count ?? 10);
console.log(title ?? "Без названия");
Вывод
10
0
Без названия

count || 10 заменил ноль на 10, хотя ноль — нормальное количество. ?? такой ошибки не делает. Для значений по умолчанию берите ??.

const count = 0; заменяется на b остаётся a || b b — вместо любого ложного a 0 "" false NaN null undefined count || 10 10 ноль потерян a ?? b b — только вместо null и undefined 0 "" false NaN null undefined count ?? 10 0 ноль остался нулём
Оператор || подставляет b вместо любого ложного значения, в том числе вместо 0 и пустой строки, а ?? — только вместо null и undefined, поэтому count ?? 10 при count = 0 оставляет 0.

Коротко

Проверьте себя

1. Что выведет console.log("3" + 4)?
2. Чему равно 10 % 3?
3. Почему лучше писать ===, а не ==?
4. Что выведет console.log(0 ?? 5)?