Программа часто должна выбирать: сделать одно или другое. Чтобы выбрать, нужно сначала задать вопрос. Вопрос в коде — это сравнение.
const age = 20
age > 18 // true
age < 18 // false
age >= 20 // true больше или равно
age <= 19 // false меньше или равно
age === 20 // true равно
age !== 20 // false не равноЛюбое сравнение даёт один из двух ответов: true (да) или false (нет).
Других ответов у него не бывает.
Три знака равно, а не два
Один знак = — это не сравнение, а присваивание: «положи значение в
переменную». Для сравнения нужно больше знаков, и здесь есть выбор.
'10' == 10 // true
'10' === 10 // falseДва знака == перед сравнением сами приводят значения к одному типу. Строка
'10' превращается в число, и они оказываются равны. Правила такого
приведения запутанные, и они дают сюрпризы.
Три знака === сравнивают честно: если типы разные, значения не равны.
Строка не равна числу, даже если выглядит так же.
Берите === и !== всегда. Так вы точно знаете, что сравниваете.
Несколько вопросов сразу
Иногда одного вопроса мало. Для этого есть логические операторы:
const age = 25
const hasTicket = true
age >= 18 && hasTicket // true «и»: верно оба
age < 18 || hasTicket // true «или»: верно хотя бы одно
!hasTicket // false «не»: переворачивает ответ&& даёт true, только когда верны обе части. || — когда верна хотя бы
одна. ! превращает true в false и наоборот.
Проверка идёт слева направо и останавливается, как только ответ ясен. Если
слева от && уже false, правую часть язык даже не смотрит: результат всё
равно будет false.
if, else if, else
Теперь ответ на вопрос можно использовать, чтобы выбрать, какой код выполнить.
const hour = 15
if (hour < 12) {
console.log('утро')
} else if (hour < 18) {
console.log('день')
} else {
console.log('вечер')
}В круглых скобках после if стоит вопрос. Если ответ true, выполняется
блок в фигурных скобках, а остальные ветки пропускаются.
else if проверяется, только если все условия выше оказались ложными. Поэтому
во второй ветке не нужно писать hour >= 12 && hour < 18. Мы попадём туда,
только если hour < 12 уже не сработало.
Последний else ловит всё, что не подошло ни под одно условие. Он
необязателен. Но если его нет, спросите себя: что будет, когда не подойдёт
ничего?
Внутри функции в ветке часто стоит return. Он отдаёт ответ и сразу
заканчивает работу функции, поэтому следующие ветки уже не проверяются.
Остаток от деления: %
Частый вопрос в условиях — делится ли число на другое без остатка. Для этого
есть знак %. Он не про проценты: он даёт остаток от деления.
console.log(7 % 2) // 1 — семь на два делится с остатком 1
console.log(10 % 5) // 0 — делится нацело
console.log(12 % 10) // 2 — последняя цифра числаЕсли остаток ноль — число делится нацело. Отсюда проверка на чётность:
const n = 14
if (n % 2 === 0) {
console.log('чётное')
} else {
console.log('нечётное')
}Тернарный оператор
Когда нужно выбрать одно из двух значений, if получается длинным. Есть
короткая запись:
const status = age >= 18 ? 'взрослый' : 'ребёнок'Читается как вопрос: условие, знак ?, значение «если да», двоеточие,
значение «если нет». Результат сразу можно положить в переменную или вернуть.
Это удобно для выбора из двух вариантов. Если вариантов три и больше, пишите
обычный if — вложенные друг в друга ? : читать тяжело.
Что условие считает ложью
В скобки if можно поставить не только сравнение, но и любое значение. Язык
сам решит, считать его правдой или ложью.
Ложных значений шесть: false, 0, '' (пустая строка), null,
undefined и NaN. Всё, что означает «ничего» или «пусто».
Всё остальное — правда. В том числе строка '0' и строка с пробелом ' ':
в них есть символы, значит они не пустые.
Запасное значение: ??
Иногда значения может не быть, и нужно подставить запасное. Оператор ??
берёт правую часть, только если слева null или undefined:
const count = 0
count ?? 10 // 0 ноль — настоящее значение
count || 10 // 10 || считает ноль ложью и подменяет его|| здесь тоже сработает, но он подменяет все шесть ложных значений, включая
ноль. Если ноль для вас — нормальный ответ, берите ??.
Теперь попробуйте сами. Код выполняется прямо в браузере — нажмите «Запустить», и увидите результат через миг.