Условия: if, else и тернарный оператор

ветвления≈ 7 минут

Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.

Программа без условий умеет только одно — идти прямо. if даёт ей развилку: посмотреть на значение и решить, какой код выполнить, а какой пропустить. Разберём три способа записать такой выбор — и приём, который спасает код от лестницы отступов.

Разделы темы:·

У if два места: условие в круглых скобках и блок кода в фигурных. Если условие истинно, блок выполняется; если нет — движок перепрыгивает через него, как будто этих строк нет. Необязательный else добавляет вторую дорогу: «во всех остальных случаях сделай вот это».

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

В скобках может стоять любое выражение, не только сравнение. Сравнения вроде <, > и === сами дают true или false, но условие спокойно примет и переменную, и результат &&, и вызов функции — что угодно, у чего есть значение.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Когда веток больше двух, они выстраиваются в цепочку: if, затем сколько угодно else if, и в конце необязательный else. Движок идёт сверху вниз и останавливается на первом истинном условии — остальные он даже не проверяет.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Отсюда главное правило цепочки: порядок значим. Поменяйте местами первые две проверки — и score >= 70 перехватит все высокие баллы, а «Отлично» не выведется никогда. Условия в цепочке идут от самого узкого к самому широкому.

if не требует, чтобы в скобках было именно true или false. Любое значение он молча приводит к логическому — так же, как это делает функция Boolean(). Ложных значений мало, и их список стоит выучить целиком: всё, чего в нём нет, — истинно.

ЗначениеВ условииКомментарий
falseложьтот самый, буквальный
0, -0, 0nложьвсе нули, включая BigInt
"" (пустая строка)ложьа вот «0» и «false» — уже истина
nullложьзначения намеренно нет
undefinedложьзначение не задавали
NaNложьрезультат неудачной арифметики
js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Пустой массив, пустой объект, строка из одного пробела, отрицательное число — всё это истинно. Зато ноль ложен, и здесь прячется классическая ловушка: если ноль для вас законное значение, а не «данных нет», короткая проверка соврёт.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Сравнивать с true руками не нужно: if (isReady === true) делает лишний шаг — скобки if и так приводят значение к логическому.

if — это инструкция: он выполняет код, но сам ничего не отдаёт. Тернарный оператор — выражение: условие ? значение_если_истина : значение_если_ложь. Он вычисляет одну из веток и возвращает её результат, поэтому его можно присвоить переменной или вставить прямо в строку. Как способ выбрать одно значение из двух он появлялся в статье «Операторы и математика» — здесь важно другое: чем он отличается от if и когда его лучше не брать.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Тернарник читаемее if ровно в одном случае: обе ветки дают одно и то же — значение для одной переменной или кусок текста, — и вся конструкция помещается в строку. Если в ветках происходят разные действия или их несколько, берите if: экономия на строках обернётся потерей времени при чтении.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Тернарники вкладываются друг в друга, и получается аналог цепочки else if. Пока веток три и они короткие — читается сносно.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

На четвёртой ветке или при длинных выражениях такая строка превращается в ребус. Признак, что пора переписать на if: вам приходится считать двоеточия, чтобы понять, где чья ветка.

Условия можно вкладывать друг в друга, и поначалу это кажется естественным: «если вошёл — то если оплатил — то...». Проблема в том, что каждый уровень сдвигает код вправо и добавляет читателю ещё одно «а мы точно всё ещё внутри первой проверки?».

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Приём раннего выхода переворачивает логику: сначала отсекаем частные и «плохие» случаи по одному, а основной сценарий остаётся в конце, без единого отступа. Лестница превращается в плоский список, и каждую строку можно прочитать отдельно от остальных.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Функции ждут нас в следующей главе, но приём стоит увидеть целиком: внутри функции ранний выход делает return, и тогда даже else становится не нужен — после return функция просто заканчивается.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

  • 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.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Порядок проверок здесь и есть вся задача. Условия age < 7 и age < 18 идут первыми, потому что они самые узкие: до следующей ветки дойдёт только тот, кто не попал в предыдущие. Проверку на 65 лет достаточно написать как age >= 65, а последний else ловит всех остальных.

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.

Проверьте на трёх значениях: 5 даёт «бесплатно», 30 — «500 руб», 70 — «200 руб». Если поставить age >= 65 первым, ничего не сломается, а вот ветка с ценой 500 в начале цепочки перехватит вообще всех — держите широкие условия внизу.

Свернуть в тернарник

Перед вами if, обе ветки которого делают одно и то же — присваивают значение одной переменной. Это ровно тот случай, для которого создан тернарный оператор. Перепишите код так, чтобы advice объявлялась и получала значение в одной строке.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Условие переезжает влево от ?, значения веток — по обе стороны от :. Отдельное объявление let advice; больше не нужно: переменная сразу получает результат выражения.

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.

Пять строк превратились в три, и читать их стало легче — но только потому, что ветки короткие и обе про одно значение. Если бы в них печатались разные сообщения или менялись разные переменные, честнее было бы оставить if.