Логические операторы в JavaScript — это как дорожные знаки для программы. Они помогают решить, куда пойдет "поток" выполнения кода, в зависимости от того, какие условия выполняются.
В повседневной жизни мы постоянно используем логику: идем ли мы на прогулку только если сегодня тепло и нет дождя? Заказываем ли мы десерт, если хотя бы одно блюдо в меню нам нравится? Именно такую "житейскую" логику мы переносим в код с помощью логических операторов.
В этом уроке мы разберем, как работают основные логические операторы в JavaScript (&&, ||, !), научимся комбинировать условия, избегать лишнего дублирования кода и писать вложенные проверки.
Что вы узнаете в рамках статьи
- Как работает оператор И (
&&) и когда он возвращаетtrue. - Как работает оператор ИЛИ (
||) и зачем он нужен. - Как работает оператор НЕ (
!) и что значит "инвертировать" значение. - Как комбинировать условия для сложных проверок.
- Как избежать дублирования кода в условиях.
- Как писать вложенные условия и когда это уместно.
- Какие ошибки часто допускают при работе с логическими операторами.
Ключевые термины
- Логический оператор — символ или комбинация символов, которые позволяют объединять или изменять логические значения (
trueилиfalse). &&(логическое И) — возвращаетtrue, если оба условия истинны.||(логическое ИЛИ) — возвращаетtrue, если хотя бы одно условие истинно.!(логическое НЕ) — инвертирует логическое значение (true→false,false→true).- Вложенные условия — конструкции, в которых один оператор
ifнаходится внутри другого.
Логическое И (&&)
Логический оператор И (&&) используется, когда нам нужно, чтобы оба условия были истинными (true). Если хотя бы одно из условий окажется ложным (false), результат выражения сразу станет false.
Проще говоря:
true && true → true
true && false → false
false && true → false
false && false → false
Житейская аналогия
Представим, что мы выбираем место для отдыха. У нас есть два обязательных критерия:
- Тёплое место — мы не хотим мерзнуть в отпуске.
- Близко к воде — чтобы можно было купаться.
Правило: Место нам подходит только если оба критерия выполнены.
const isWarmPlace = true; // Место тёплое
const isNearWater = true; // Место близко к воде
if (isWarmPlace && isNearWater) {
console.log('Это идеальное место для отдыха!');
} else {
console.log('Поищем другое место...');
}
Что происходит по шагам:
- Проверяется первое условие
isWarmPlace→true. - Проверяется второе условие
isNearWater→true. - Оператор
&&видит, что оба условияtrue && true→ результатtrue. - Выполняется код в первой ветке
if.
Если хотя бы одно условие false, программа перейдет в ветку else.
Разбор разных комбинаций
isWarmPlace |
isNearWater |
Выражение isWarmPlace && isNearWater |
Результат |
|---|---|---|---|
true |
true |
true && true |
true |
true |
false |
true && false |
false |
false |
true |
false && true |
false |
false |
false |
false && false |
false |
Пример из жизни в IT
Представьте, что пользователь может войти на сайт только если:
- у него есть учетная запись
- и он подтвердил свой email.
const hasAccount = true;
const emailConfirmed = false;
if (hasAccount && emailConfirmed) {
console.log('Добро пожаловать!');
} else {
console.log('Пожалуйста, зарегистрируйтесь или подтвердите email.');
}
В этом примере вход невозможен, потому что emailConfirmed = false, а для && это значит, что всё условие ложно.
Логическое ИЛИ (||)
Логический оператор ИЛИ (||) используется, когда нам нужно, чтобы хотя бы одно из условий было истинным (true). Если оба условия окажутся ложными (false), результат выражения будет false.
Проще говоря:
true || true → true
true || false → true
false || true → true
false || false → false
Житейская аналогия
Представим, что мы выбираем кафе для вечернего визита. У нас есть два критерия:
- Хорошее меню — чтобы было вкусно и разнообразно.
- Уютная атмосфера — чтобы приятно провести время.
Правило: Кафе подходит, если хотя бы один из этих пунктов выполняется.
const hasGoodMenu = true; // Кафе с хорошим меню
const hasCozyAtmosphere = false; // Кафе без уютной атмосферы
if (hasGoodMenu || hasCozyAtmosphere) {
console.log('Это кафе подходит для вечернего посещения!');
} else {
console.log('Нужно поискать другое кафе...');
}
Что происходит по шагам:
- Проверяется первое условие
hasGoodMenu→true. - Для
||уже этого достаточно, чтобы весь результат былtrue. Второе условие даже не проверяется (это называется ленивое вычисление, или short-circuit evaluation). - Код внутри
ifвыполняется, и мы видим сообщение:
Это кафе подходит для вечернего посещения!
Разбор всех комбинаций
|
|
|
Выражение |
Результат |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пример из жизни в IT
Допустим, мы даем доступ к чату поддержки, если:
- пользователь — премиум-подписчик
- или он администратор.
const isPremiumUser = false;
const isAdmin = true;
if (isPremiumUser || isAdmin) {
console.log('Доступ к чату поддержки открыт.');
} else {
console.log('Нужна премиум-подписка или права администратора.');
}
В этом случае доступ есть, потому что хотя пользователь и не премиум, он является администратором (false || true → true).
Логическое НЕ (!)
Логический оператор НЕ (!) используется для инверсии (отрицания) логического значения. Он превращает:
true→falsefalse→true
Если говорить просто — ! меняет смысл условия на противоположный.
Житейская аналогия
Представьте, что мы проверяем регистрацию пользователя на сайте. Если он не зарегистрирован — предлагаем ему зарегистрироваться. Если зарегистрирован — пускаем на сайт.
const isRegistered = false;
if (!isRegistered) {
console.log('Пользователь не зарегистрирован. Пожалуйста, зарегистрируйтесь.');
} else {
console.log('Добро пожаловать на сайт!');
}
Что происходит по шагам:
- Переменная
isRegisteredимеет значениеfalse. - Оператор
!инвертирует это значение:!false → true. - Так как условие в
ifсталоtrue, выполняется первый блок кода.
Таблица истинности для !
| Значение | !Значение |
|---|---|
true |
false |
false |
true |
Пример из жизни в IT
Допустим, мы проверяем, пустой ли список задач. Если он пустой — пишем "Нет задач". Если не пустой — выводим список.
const tasks = [];
if (!tasks.length) {
console.log('Нет задач');
} else {
console.log('Ваши задачи:', tasks);
}
Здесь tasks.length возвращает 0, а это falsy-значение. !0 → true, поэтому выводится сообщение "Нет задач".
Двойное отрицание (!!)
Если применить оператор ! дважды, можно принудительно преобразовать любое значение к булевому типу:
console.log(!!'Hello'); // true
console.log(!!0); // false
console.log(!!null); // false
console.log(!!123); // true
Это удобно, когда нужно явно получить true или false из переменной, которая может содержать разные типы данных.
Не только с булевыми значениями
Как и && и ||, оператор ! работает с любыми значениями, которые предварительно приводятся к логическому типу по правилам truthy/falsy.
Falsy-значения в JavaScript: false, 0, "" (пустая строка), null, undefined, NaN.
Пример:
console.log(!''); // true (пустая строка — falsy)
console.log(!42); // false (число — truthy)
console.log(!undefined); // true
Комбинация операторов
В реальных проектах редко встречаются условия, состоящие из одного оператора. Чаще всего нам нужно проверить несколько критериев одновременно, и здесь мы комбинируем &&, || и !.
Пример: доступ к фильму
Допустим, у нас есть онлайн-кинотеатр. Пользователь может посмотреть фильм только если:
- Он зарегистрирован.
- Ему 16 лет или больше.
- Фильм доступен на платформе.
const isRegistered = true; // Пользователь зарегистрирован
const age = 20; // Возраст пользователя
const isMovieAvailable = true; // Фильм доступен
if (isRegistered && age >= 16 && isMovieAvailable) {
console.log('Фильм доступен для просмотра.');
} else {
console.log('Фильм недоступен для просмотра.');
}
Как работает проверка по шагам
- Проверка
isRegistered→true. - Проверка
age >= 16→20 >= 16→true. - Проверка
isMovieAvailable→true. - Так как это
true && true && true→ результатtrue, выполняется первая веткаif.
Что если одно из условий false
isRegistered |
age>=16 |
isMovieAvailable |
Итоговое выражение | Результат |
|---|---|---|---|---|
true |
true |
true |
true && true && true |
true |
false |
true |
true |
false && true && true |
false |
true |
false |
true |
true && false && true |
false |
true |
true |
false |
true && true && false |
false |
Как только встречается false в &&, дальнейшая проверка останавливается (ленивое вычисление).
Добавляем "ИЛИ" для альтернативных условий
Представим, что фильм можно смотреть и без регистрации, если он в бесплатной библиотеке:
const isRegistered = false;
const age = 20;
const isMovieAvailable = true;
const isFreeMovie = true;
if ((isRegistered && age >= 16 && isMovieAvailable) || isFreeMovie) {
console.log('Фильм доступен для просмотра.');
} else {
console.log('Фильм недоступен для просмотра.');
}
Здесь || isFreeMovie позволяет пропустить проверку регистрации, если фильм бесплатный.
Используем "НЕ" для запретов
Если пользователь в бане (isBanned = true), он не может смотреть фильм:
const isRegistered = true;
const age = 20;
const isMovieAvailable = true;
const isBanned = false;
if (isRegistered && age >= 16 && isMovieAvailable && !isBanned) {
console.log('Фильм доступен для просмотра.');
} else {
console.log('Фильм недоступен для просмотра.');
}
Тут !isBanned означает "пользователь не забанен".
Избегаем дублирования кода
Плохое решение (два одинаковых действия в разных ветках):
if (number % 2 === 0) {
result = 'YES';
} else if (number >= 10 && number <= 100) {
result = 'YES';
} else {
result = 'NO';
}
Хорошее решение (объединили условия):
if ((number % 2 === 0) || (number >= 10 && number <= 100)) {
result = 'YES';
} else {
result = 'NO';
}
Вложенные условия
Вложенные условия — это ситуация, когда один оператор if находится внутри другого. Они позволяют проверять условия поэтапно: если первое условие не подошло, внутри блока else можно выполнить дополнительные проверки.
Житейская аналогия
Представьте, что мы определяем возрастную категорию человека:
- Если ему 18 лет или больше — он совершеннолетний.
- Если меньше 18, но 13 или больше — он подросток.
- Если меньше 13 — он ребенок.
Пример кода
const age = 25;
if (age >= 18) {
console.log('Вы совершеннолетний');
} else {
if (age >= 13) {
console.log('Вы подросток');
} else {
console.log('Вы ребенок');
}
}
Разбор по шагам
- Проверка
age >= 18:- Если
true→ выполняется первая ветка (Вы совершеннолетний). - Если
false→ переходим в блокelse.
- Если
- В блоке
elseснова проверка:age >= 13:- Если
true→ выполняетсяconsole.log('Вы подросток'). - Если
false→ выполняетсяconsole.log('Вы ребенок').
- Если
Таблица примеров
age |
Результат |
|---|---|
| 20 | Вы совершеннолетний |
| 15 | Вы подросток |
| 8 | Вы ребенок |
Когда использовать вложенные условия
- Если нужно разделить проверку на несколько уровней.
- Если логика подразумевает дополнительные уточнения после первой проверки.
Не стоит: если условий слишком много (4–5 уровней вложенности) — код становится трудночитаемым. В таком случае лучше использовать else if или другие конструкции.
Альтернатива: else if
Тот же код можно записать компактнее с помощью else if:
if (age >= 18) {
console.log('Вы совершеннолетний');
} else if (age >= 13) {
console.log('Вы подросток');
} else {
console.log('Вы ребенок');
}
Преимущество этого варианта — меньше вложенности, проще читать.
Комбинация с логическими операторами
Иногда внутри вложенного условия можно использовать && или ||, чтобы сократить количество уровней:
if (age < 18 && age >= 13) {
console.log('Вы подросток');
}
Наиболее частые ошибки
- Использование
=вместо==или===в условиях. (=— это присваивание, а не сравнение) - Слишком сложные вложенные условия вместо упрощения через логические операторы.
- Дублирование одинакового кода в разных ветках
ifиelse if.
Наиболее частые вопросы
Вопрос: Можно ли использовать логические операторы без if?\
Ответ: Да. Например:
const canGo = isSunny || hasUmbrella;
Итоги
Сегодня мы:
- Разобрали, как работают
&&,||и!. - Научились комбинировать условия и избегать дублирования кода.
- Рассмотрели вложенные условия и способы упрощения логики.
- Узнали о типичных ошибках и вопросах при работе с логическими операторами.
Теперь вы сможете писать более чистые и читаемые условия, что сделает ваш код надежнее и проще для понимания.