5.01. Выражения и операторы
Выражения и операторы
Первичные выражения (this, литералы, [], {}, function, class, шаблонные строки)
Левосторонние выражения (доступ к свойствам, new, super, import.meta)
Унарные операторы: typeof, delete, void, +, -, !, await
Арифметические операторы
Операторы сравнения и равенства (==, ===, in, instanceof)
Логические и условные операторы (&&, ||, ??, тернарный)
Битовые и побитовые операторы
Операторы присваивания (включая составные и деструктурирующие)
Расширение (spread) и остаток (rest): ...
Оператор запятой ,
Условия: if...else, switch
★ Условные операторы – ключевые механизмы, которые используются для выполнения разных действий в зависимости от условия.
Как мы ранее отметили, алгоритм может двигаться по развилке, что влечёт за собой две составляющие – проверку и условие. Проверка – это процесс анализа имеющихся данных на совпадение с условием. Если же совпадений не нашлось, выполняется альтернативная задача. То есть, проверка выдаст либо ДА (истина, true, совпадение есть), либо НЕТ (ложь, false, совпадений нет).
if / else – (если / иначе) – основной условный оператор:
- в скобках определяется выражение – условие;
- выражение может принимать true или false;
- оператор проверяет условие в if;
- если оно true – выполняет блок кода внутри if;
- если false – переходит к else (если есть else, если нет – то ничего не происходит).
Пример:
const age = 18;
if (age >= 18) {
console.log("Доступ разрешён"); // Выполнится, если age >= 18
} else {
console.log("Доступ запрещён"); // Выполнится, если age < 18
}
Здесь классический пример, который уже затрагивали ранее – проверка анализирует значение переменной age на совпадение с условием «больше или равно 18», если true – выполняется то, что указано в блоке if, иначе – else.
else if проверяет несколько условий (это как несколько if):
const time = 14;
if (time < 12) {
console.log("Утро");
} else if (time < 18) {
console.log("День"); // Выведется, так как 14 < 18
} else {
console.log("Вечер");
}
Тут всё просто. Чтобы не указывать каждый раз if(), if(), if(), можно сделать else if, что объединит всё логически, и будет расширять в стиле «ЕСЛИ ЖЕ».
Но есть и другой подход. Если мы затрагиваем множество кейсов, когда придётся делать целую кучу проверок, то if/else if уже будут не так эффективны, и используется switch/case.
switch для множественных проверок одного значения, напоминает if, но работает через «кейсы» - случаи. Работает как «в случае, если так, то поступать вот так»:
- switch содержит несколько блоков case;
- каждый case – вариант условия;
- если условие совпадёт – код будет выполняться до ключевого слова break;
- если совпадений нет – пойдет по кейсу «default» - «по умолчанию»:
const day = "пн";
switch (day) {
case "пн":
console.log("Понедельник"); // Выполнится
break;
case "вт":
console.log("Вторник");
break;
default:
console.log("Неизвестный день");
}
switch используется для выполнения разных блоков кода в зависимости от значения переменной или выражения. Он особенно полезен, когда нужно проверить несколько возможных вариантов. Конструкция выбора начинается с ключевого слова switch (селектор), где селектор - переменная или какое-то значение. В примере выше селектором является константа day, которая изначально равна понедельнику - следовательно, оператор зафиксирует, что значение day подпадает под первый case.
case указывает одно из возможных значений для сравнения, и таких кейсов может быть множество. Чтобы текущий кейс при совпадении завершился и не попал в следующий, используется ключевое слово break. Если забыть написать break, произойдёт fall-through — выполнение перейдёт к следующему case, даже если он не совпадает. Это странно, но можете увидеть сами, если введёте следующий код:
let num = 2;
switch(num) {
case 1:
console.log("1");
case 2:
console.log("2");
case 3:
console.log("3");
}
Как видим, здесь нет break, а case совпадает с 2, но при совпадении запустится третий кейс и мы получим в консоли и 2, и 3. Такие дела. Это может быть полезно в некоторых случаях, но чаще всего это ошибка. Поэтому всегда используйте break.
★ Тернарные операторы – это краткая форма записи условного выражения, которая состоит из трёх частей (потому и тернарный). Синтаксис прост:
условие ? выражение_если_истина : выражение_если_ложь
Это позволяет сократить блок if-else до одной строки!
Пример:
let age = 18;
let message = age >= 18 ? 'Взрослый' : 'Ребёнок';
console.log(message); // Выведет: "Взрослый"
Тут проверка производится по принципу:
«Пусть возраст будет 18. Пусть сообщение будет «Взрослый», если возраст больше или равен 18, во всех остальных случаях пусть сообщение будет «Ребёнок»».
Тернарный оператор, в отличие от блоков if, возвращает значение (тогда как в if-else можно ничего не указывать – просто ничего не произойдёт), поэтому тернарный и используется в присваиваниях и возвратах функций. Тернарный оператор возвращает либо true (да, истина), либо false (нет, ложь).
Важно: код при тернарном операторе хоть и короче, но становится менее читаемым.
Пример:
function getFee(isVIP) {
return isVIP ? '$2' : '$10';
}
console.log(getFee(true)); // Выведет: "$2"
console.log(getFee(false)); // Выведет: "$10"
На первый взгляд может быть страшно.
Но смысл здесь такой:
- есть функция getFee, которая принимает аргумент isVIP и возвращает либо $2, либо $10, в зависимости от значения isVIP;
- вызывая getFee, указав в качестве аргумента true, мы получим $2;
- а если isVIP (входной аргумент) будет false, мы получаем $10.