Логические операторы в JavaScript (&&, ||, !) используются для комбинирования условий и управления потоком выполнения кода. Они работают не только с булевыми значениями, но и возвращают один из операндов, что делает их мощным инструментом для написания лаконичного кода.
Ключевые аспекты
&& (AND) — возвращает первое ложное значение или последнее, если все истинные
|| (OR) — возвращает первое истинное значение или последнее, если все ложные
! (NOT) — инвертирует булево значение
Short-circuit evaluation — вычисление прекращается, как только результат становится определён
Falsy values — false, 0, "", null, undefined, NaN
Плюсы
Краткий синтаксис для условий
Удобны для значений по умолчанию (||)
Позволяют условно выполнять код (&&)
Высокая производительность благодаря короткому замыканию
Минусы
Неочевидное поведение с falsy значениями (0, "")
Путаница между логическим и побитовым операторами
Чрезмерное использование усложняет читаемость
Частые ошибки на собеседованиях
Путают приоритет операторов (&& выше чем ||)
Забывают, что операторы возвращают операнд, а не true/false
Не учитывают, что 0 и "" — falsy значения при использовании ||
Путают || с nullish coalescing оператором ?? (ES2020)
Введение и проблематика
Логические операторы — фундаментальная часть любого языка программирования. В JavaScript они имеют особое поведение: вместо возврата true или false они возвращают один из операндов. Это делает их мощным инструментом не только для логических проверок, но и для написания элегантного кода.
В JavaScript логические операторы работают с любыми типами данных, а не только с булевыми значениями. Это ключевое отличие от многих других языков.
Почему это важно?
Понимание логических операторов критично для написания условий
Короткое замыкание позволяет оптимизировать код
Часто используются для значений по умолчанию и условного выполнения
Базовая теория
Три логических оператора
JavaScript имеет три логических оператора:
Оператор
Название
Описание
&&
AND (И)
Возвращает первое falsy или последнее значение
||
OR (ИЛИ)
Возвращает первое truthy или последнее значение
!
NOT (НЕ)
Инвертирует булево значение
Falsy и Truthy значения
⚠️
Понимание falsy/truthy — ключ к работе с логическими операторами!
Falsy значения (приводятся к false):
js
false// само значение false0// ноль-0// минус ноль""// пустая строкаnull// отсутствие значенияundefined// неопределённое значениеNaN// Not a Number
Truthy значения — всё остальное:
js
true42// любое число кроме 0"hello"// любая непустая строка[] // пустой массив (!){} // пустой объект (!)function(){} // функция
Пустой массив [] и пустой объект {} — truthy значения! Это частая ловушка.
Практические примеры
Оператор AND (&&)
Возвращает первое falsy значение или последнее значение, если все truthy.
❓
Code Example 1: Что выведет каждый console.log? Какое значение вернёт && если первый операнд falsy?
// Вызов функции только если условие истинноconstisLoggedIn=true;isLoggedIn &&showDashboard(); // showDashboard() выполнится// Доступ к вложенным свойствамconstuser= { profile: { name:"John" } };constname= user &&user.profile &&user.profile.name;console.log(name); // "John"// Короткая запись условного рендеринга (в React){isAdmin && <AdminPanel />}
Оператор OR (||)
Возвращает первое truthy значение или последнее значение, если все falsy.
❓
Code Example 2: Что выведет каждый console.log? Какое значение вернёт || если все операнды falsy?
Code Example 3: Что выведет greet() без аргументов? Почему?
js
// Установка значения по умолчаниюfunctiongreet(name) { name = name ||"Гость";console.log("Привет, "+ name +"!");}greet("Иван"); // "Привет, Иван!"greet(); // "Привет, Гость!"// Получение первого доступного значенияconstconfig= userConfig || defaultConfig || {};// Значение по умолчанию для параметровconstport=process.env.PORT||3000;
Оператор NOT (!)
Инвертирует булево значение. Сначала приводит операнд к boolean, затем инвертирует.
❓
Code Example 4: Что выведет каждый console.log? Для чего используется !!?
Короткое замыкание — это оптимизация, при которой второй операнд не вычисляется, если результат уже определён первым.
js
// && — если первый falsy, второй не вычисляетсяfalse&&expensiveOperation(); // expensiveOperation НЕ вызовется// || — если первый truthy, второй не вычисляетсяtrue||expensiveOperation(); // expensiveOperation НЕ вызовется// Практический примерconstuser=getUser() ||createGuestUser();// createGuestUser() вызовется только если getUser() вернёт falsy
Приоритет операторов
⚠️
Оператор && имеет более высокий приоритет, чем ||!
❓
Code Example 5: Какой результат у каждого выражения? Почему скобки меняют результат?