Логические операторы 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 — популярный способ явно преобразовать любое значение в булево.


Приоритет операторов

Приоритет (с высшего к низшему):

  1. ! — НЕ (наиболее высокий)
  2. && — И
  3. || — ИЛИ (наименьший)

Пример:

console.log(true || false && false); // true
// Эквивалентно: true || (false && false) → true || false → true

Чтобы избежать путаницы — всегда используйте скобки:

console.log((true || false) && false); // false

(Больше про приоритет операторов будет в этой же теме)