Условия: if, else и тернарный оператор
Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.
Программа без условий умеет только одно — идти прямо. if даёт ей развилку: посмотреть на значение и решить, какой код выполнить, а какой пропустить. Разберём три способа записать такой выбор — и приём, который спасает код от лестницы отступов.
У if два места: условие в круглых скобках и блок кода в фигурных. Если условие истинно, блок выполняется; если нет — движок перепрыгивает через него, как будто этих строк нет. Необязательный else добавляет вторую дорогу: «во всех остальных случаях сделай вот это».
В скобках может стоять любое выражение, не только сравнение. Сравнения вроде <, > и === сами дают true или false, но условие спокойно примет и переменную, и результат &&, и вызов функции — что угодно, у чего есть значение.
Когда веток больше двух, они выстраиваются в цепочку: if, затем сколько угодно else if, и в конце необязательный else. Движок идёт сверху вниз и останавливается на первом истинном условии — остальные он даже не проверяет.
Отсюда главное правило цепочки: порядок значим. Поменяйте местами первые две проверки — и score >= 70 перехватит все высокие баллы, а «Отлично» не выведется никогда. Условия в цепочке идут от самого узкого к самому широкому.
if не требует, чтобы в скобках было именно true или false. Любое значение он молча приводит к логическому — так же, как это делает функция Boolean(). Ложных значений мало, и их список стоит выучить целиком: всё, чего в нём нет, — истинно.
| Значение | В условии | Комментарий |
|---|---|---|
| false | ложь | тот самый, буквальный |
| 0, -0, 0n | ложь | все нули, включая BigInt |
| "" (пустая строка) | ложь | а вот «0» и «false» — уже истина |
| null | ложь | значения намеренно нет |
| undefined | ложь | значение не задавали |
| NaN | ложь | результат неудачной арифметики |
Пустой массив, пустой объект, строка из одного пробела, отрицательное число — всё это истинно. Зато ноль ложен, и здесь прячется классическая ловушка: если ноль для вас законное значение, а не «данных нет», короткая проверка соврёт.
Сравнивать с true руками не нужно: if (isReady === true) делает лишний шаг — скобки if и так приводят значение к логическому.
if — это инструкция: он выполняет код, но сам ничего не отдаёт. Тернарный оператор — выражение: условие ? значение_если_истина : значение_если_ложь. Он вычисляет одну из веток и возвращает её результат, поэтому его можно присвоить переменной или вставить прямо в строку. Как способ выбрать одно значение из двух он появлялся в статье «Операторы и математика» — здесь важно другое: чем он отличается от if и когда его лучше не брать.
Тернарник читаемее if ровно в одном случае: обе ветки дают одно и то же — значение для одной переменной или кусок текста, — и вся конструкция помещается в строку. Если в ветках происходят разные действия или их несколько, берите if: экономия на строках обернётся потерей времени при чтении.
Тернарники вкладываются друг в друга, и получается аналог цепочки else if. Пока веток три и они короткие — читается сносно.
На четвёртой ветке или при длинных выражениях такая строка превращается в ребус. Признак, что пора переписать на if: вам приходится считать двоеточия, чтобы понять, где чья ветка.
Условия можно вкладывать друг в друга, и поначалу это кажется естественным: «если вошёл — то если оплатил — то...». Проблема в том, что каждый уровень сдвигает код вправо и добавляет читателю ещё одно «а мы точно всё ещё внутри первой проверки?».
Приём раннего выхода переворачивает логику: сначала отсекаем частные и «плохие» случаи по одному, а основной сценарий остаётся в конце, без единого отступа. Лестница превращается в плоский список, и каждую строку можно прочитать отдельно от остальных.
Функции ждут нас в следующей главе, но приём стоит увидеть целиком: внутри функции ранний выход делает return, и тогда даже else становится не нужен — после return функция просто заканчивается.
ifвыполняет блок, когда условие истинно;elseберёт на себя все остальные случаи- Цепочка
else ifпроверяется сверху вниз и останавливается на первой подошедшей ветке, поэтому узкие условия идут раньше широких - Условие приводится к логическому значению: ложных значений — короткий фиксированный список (
false, нули, пустая строка,null,undefined,NaN), остальное истинно, включая"0"и[] - Тернарный оператор — выражение: он возвращает значение и хорош там, где обе ветки дают результат для одной переменной
- Вложенные условия лечатся ранним выходом: отсекаем частные случаи в начале, основной путь остаётся плоским
1/3Какое из этих значений внутри if сработает как истинное?
2/3Чем тернарный оператор принципиально отличается от if?
3/3Зачем нужен приём раннего выхода?
Цена билета
Соберите цепочку условий для кассы: до 7 лет — "бесплатно", до 18 — "300 руб", от 65 — "200 руб", во всех остальных случаях — "500 руб". Присвойте нужное значение переменной price и проверьте код на возрастах 5, 30 и 70.
Порядок проверок здесь и есть вся задача. Условия age < 7 и age < 18 идут первыми, потому что они самые узкие: до следующей ветки дойдёт только тот, кто не попал в предыдущие. Проверку на 65 лет достаточно написать как age >= 65, а последний else ловит всех остальных.
Проверьте на трёх значениях: 5 даёт «бесплатно», 30 — «500 руб», 70 — «200 руб». Если поставить age >= 65 первым, ничего не сломается, а вот ветка с ценой 500 в начале цепочки перехватит вообще всех — держите широкие условия внизу.
Свернуть в тернарник
Перед вами if, обе ветки которого делают одно и то же — присваивают значение одной переменной. Это ровно тот случай, для которого создан тернарный оператор. Перепишите код так, чтобы advice объявлялась и получала значение в одной строке.
Условие переезжает влево от ?, значения веток — по обе стороны от :. Отдельное объявление let advice; больше не нужно: переменная сразу получает результат выражения.
Пять строк превратились в три, и читать их стало легче — но только потому, что ветки короткие и обе про одно значение. Если бы в них печатались разные сообщения или менялись разные переменные, честнее было бы оставить if.