JavaScript / 39 минут
Условия и сравнения
Стройте ветвления и различайте строгое равенство и приведение типов.
- Стройте ветвления и различайте строгое равенство и приведение типов.
- Применить тему в задаче «Условия и сравнения» и объяснить граничные случаи.
Около 9 минут на чтение и разбор примеров. Практика — отдельно, в своём темпе.
Ветвление как выбор сценария
Ветвление позволяет программе выполнить разные действия при разных входных данных. Начните с формулировки правила на обычном языке: «доступ открыт, если возраст не меньше восемнадцати». Затем выделите проверяемое выражение и определите результат для обеих ветвей. Такой порядок помогает не спрятать смысл в сложной комбинации операторов. Условие должно отвечать на понятный вопрос, а название вычисленного признака может это подчеркнуть.
if проверяет истинность выражения. Блок else выполняется, если эта проверка дала ложь. Цепочка else if рассматривает варианты по порядку и выбирает первую подходящую ветвь; все последующие варианты уже не проверяются. Поэтому более узкое условие обычно нужно ставить раньше более широкого. Иначе, например, ветка «от 18 лет» поглотит отдельный случай «от 65 лет».
function category(age) {
if (age >= 65) return 'старшая группа';
if (age >= 18) return 'взрослый';
return 'ребёнок';
}Строгое равенство и преобразование типов
Оператор === сравнивает без неявного приведения типов. Число 5 и строка '5' различаются, даже если пользователю оба значения выглядят похоже. Оператор == включает правила преобразования, которые иногда полезны опытному разработчику, но затрудняют чтение случайного ввода. По умолчанию выбирайте строгое сравнение и выполняйте необходимые преобразования явно перед проверкой.
Не все значения одного типа равны по содержимому. Два отдельно созданных объекта не равны через ===, даже если их свойства совпадают. Для объектов проверяется идентичность. NaN не равно самому себе, поэтому проверяется Number.isNaN. Это разные особенности, и заменять любое сравнение универсальным JSON.stringify не следует: сериализация имеет собственные ограничения и не является общей моделью равенства.
console.log('5' === 5); // false
console.log('5' == 5); // true
console.log({ id: 1 } === { id: 1 }); // false
const user = { id: 1 };
console.log(user === user); // trueИстинные и ложные значения
Когда условию нужен boolean, JavaScript преобразует значение по правилам truthy/falsy. Ложными являются false, 0, -0, 0n, пустая строка, null, undefined и NaN. Обычные пустые объекты и массивы истинны. Поэтому проверка if (items) не отвечает на вопрос, содержит ли массив элементы. Для этого нужно явно проверить items.length, убедившись, что значение действительно массив.
Различайте отсутствие и допустимое нулевое значение. Если скидка 0 означает «скидки нет», она всё равно является корректным числом. Проверка через || может нечаянно заменить её запасным значением. Оператор ?? выбирает запасной вариант только для null и undefined. Он полезен в конфигурации и формах, когда 0, false и пустая строка должны сохраняться по контракту.
console.log(Boolean([])); // true
console.log(Boolean('')); // false
console.log(0 || 10); // 10
console.log(0 ?? 10); // 0Логические операторы и короткое замыкание
&& и || возвращают один из операндов, а не обязательно true или false. У && вычисление прекращается на первом ложном значении, у || — на первом истинном. Это короткое замыкание позволяет последовательно проверять условия и не выполнять опасную операцию, если предварительная проверка не прошла. Однако сложные цепочки с побочными эффектами быстро становятся нечитаемыми.
const canRead = user !== null && user.role === 'reader';
const title = inputTitle.trim() || 'Без названия';Во втором примере запасное название для пустой строки выбрано намеренно. В первом выражении чтение user.role не выполняется для null. Если нужен строго логический результат, стройте операнды как сравнения или используйте Boolean осознанно. Не рассчитывайте, что любой результат цепочки автоматически имеет тип boolean.
Тернарное выражение и switch
Тернарный оператор condition ? yes : no удобен для выбора одного из двух значений. Он является выражением, поэтому его результат можно вернуть или присвоить. Не превращайте несколько вложенных тернарных выражений в загадку: когда сценарии требуют подробных действий, обычные if часто понятнее. Выбор синтаксиса должен помогать увидеть правило, а не экономить строку любой ценой.
switch сравнивает значение с вариантами case строго. Если не завершить ветвь через break, return или другой выход, выполнение может перейти в следующий case. Иногда такое объединение вариантов намеренно, но его нужно делать явно. Для небольшого набора допустимых статусов switch может быть хорошей альтернативой длинной цепочке сравнений.
Границы и практическая задача
В задании возраст от 18 включительно должен давать взрослую категорию. Самые полезные проверки — 17, 18 и 19: они показывают, правильно ли выбрана граница. Проверка только 30 и 10 может не заметить ошибку с оператором > вместо >=. Возраст 0 проверяет нижний край входного диапазона, а большой возраст подтверждает, что правило не ограничено случайным примером.
Сначала напишите условие отдельно и проговорите его вслух. Затем верните строку соответствующей ветви. Не используйте console.log как результат и не преобразовывайте строковый возраст случайным нестрогим сравнением: в этой задаче контракт уже даёт число. Для самостоятельной тренировки добавьте отдельную старшую группу и объясните, почему порядок проверок становится важным.