Логические операторы JavaScript
Логические операторы — && (И), || (ИЛИ) и ! (НЕ) — позволяют комбинировать и инвертировать логические значения. В JavaScript они работают не только с true и false, но и с любыми значениями, благодаря особенностям приведения типов и механизму короткого замыкания.
Оператор && — Логическое И
Возвращает true, если оба операнда истинны.
Но в JavaScript он возвращает не булево значение, а один из операндов — первый ложный или последний истинный.
Примеры:
console.log(true && true); // true
console.log(true && false); // false
console.log(5 && "hello"); // "hello" — оба истинны, возвращён второй
console.log(0 && "test"); // 0 — первый ложный, возвращён он же
console.log("" && null); // "" — первый ложный
Короткое замыкание:
Если первый операнд — ложный, второй не вычисляется.
function log() {
console.log("Эта функция не вызовется");
return true;
}
console.log(false && log()); // false — функция log() НЕ была вызвана
✅ Это полезно для безопасного доступа к свойствам объектов:
const user = { profile: { name: "Alice" } };
// Безопасно: если user или user.profile отсутствуют — не будет ошибки
console.log(user && user.profile && user.profile.name); // "Alice"
// Если бы user был undefined — выражение остановилось бы на первом шаге
Оператор || — Логическое ИЛИ
Возвращает первый истинный операнд, или последний, если все ложные.
Примеры:
console.log(true || false); // true
console.log(false || "world"); // "world"
console.log(0 || null || 5 || 10); // 5 — первый истинный
console.log("" || 0 || false); // false — все ложные, возвращён последний
Короткое замыкание:
Если первый операнд — истинный, второй не вычисляется.
function log() {
console.log("Эта функция вызовется только если нужно");
return "result";
}
console.log(true || log()); // true — функция log() НЕ вызвана
💡 Ключевое применение: установка значений по умолчанию
function greet(name) {
name = name || "Гость"; // если name пустой/ложный — использовать "Гость"
console.log(`Привет, ${name}!`);
}
greet(); // "Привет, Гость!"
greet(""); // "Привет, Гость!"
greet(null); // "Привет, Гость!"
greet("Анна"); // "Привет, Анна!"
greet(0); // "Привет, Гость!" — осторожно!
⚠️ Внимание:
0,"",null,undefined,NaN— всё это ложные значения.
Если вы ожидаете0как валидный ввод — такой подход сломается.
Лучшая практика: используйте оператор нулевого слияния ?? (если поддерживается):
function greet(name) {
name = name ?? "Гость"; // только null или undefined → заменяются
console.log(`Привет, ${name}!`);
}
greet(0); // "Привет, 0!" — правильно!
greet(undefined); // "Привет, Гость!"
✅ Рекомендация: в современных приложениях используйте
??вместо||для установки значений по умолчанию, если вам важно отличать0,false,""отnull/undefined.
Оператор ! — Логическое НЕ
Инвертирует значение операнда. Возвращает булево значение (true или false).
Примеры:
console.log(!true); // false
console.log(!false); // true
console.log(!"hello"); // false — строка истинна
console.log(!0); // true — 0 ложен
console.log(!{}); // false — объект истинен
console.log(!!"text"); // true — двойное отрицание приводит к булеву значению
Полезное применение: приведение к булеву типу
const isEmpty = !array.length; // true, если массив пуст
const hasUser = !!user; // true, если user существует и не null/undefined
✅ Двойное отрицание
!!value— популярный способ явно преобразовать любое значение в булево.
Приоритет операторов
Приоритет (с высшего к низшему):
!— НЕ (наиболее высокий)&&— И||— ИЛИ (наименьший)
Пример:
console.log(true || false && false); // true
// Эквивалентно: true || (false && false) → true || false → true
Чтобы избежать путаницы — всегда используйте скобки:
console.log((true || false) && false); // false
(Больше про приоритет операторов будет в этой же теме)