Логические операторы

Логические операторы

Технический фундамент композиции условий

Логические операторы описывают бизнес-правила в комбинированных условиях:

  • && и || определяют обязательные и альтернативные критерии;
  • short-circuit влияет и на результат, и на выполнение правой части выражения;
  • порядок проверок должен отражать бизнес-приоритеты;
  • длинные условия лучше декомпозировать на именованные флаги.

Такая структура делает поведение сложных веток предсказуемым и тестируемым.

Почему логические операторы важны для продуктовых правил

Одного сравнения обычно недостаточно. В реальном коде условия комбинируются: пользователь авторизован и email подтвержден, подписка активна или включен trial, действие доступно не заблокированным. Логические операторы позволяют собирать такие правила.

Ключевой момент: &&, ||, ! управляют тем, как несколько булевых условий дают единый результат.

Проверь себя: почему неправильный порядок условий может открыть доступ не тем пользователям?

Базовые операторы

  • && (и): true, если оба операнда true;
  • || (или): true, если хотя бы один true;
  • ! (не): инвертирует значение.
const isAuth = true;
const isVerified = false;

console.log(isAuth && isVerified); // false
console.log(isAuth || isVerified); // true
console.log(!isVerified); // true

Смотри, что важно: логические операторы могут работать не только с boolean, но и с truthy/falsy значениями.

Короткое замыкание (short-circuit)

JavaScript может не вычислять вторую часть выражения, если результат уже понятен.

const isReady = false;
isReady && console.log('Запустится только если true');

Для &&: если слева falsy, правая часть не выполняется. Для ||: если слева truthy, правая часть не выполняется.

Это полезно и для оптимизации, и для безопасных проверок.

Truthy/Falsy в логике

const name = '';
const fallbackName = name || 'Гость';
console.log(fallbackName); // Гость

Здесь часто путаются: 0, '', null, undefined, NaN, false - falsy.

Проверь себя: почему count || 1 может быть багом, если count законно может быть 0?

В таких случаях часто используют оператор нулевого слияния ?? (nullish coalescing): он считает "пустыми" только null и undefined, но не трогает 0, '' и false.

const count = 0;
console.log(count || 1); // 1 (может быть багом)
console.log(count ?? 1); // 0 (сохраняет валидный ноль)

Мини-сценарий: выбор экрана

function getScreen(isBlocked, isAuth, hasSubscription) {
  if (isBlocked) return 'blocked';
  if (!isAuth) return 'auth-required';
  if (isAuth && hasSubscription) return 'full';
  return 'limited';
}

Логические операторы здесь описывают бизнес-приоритеты в явном виде.

Смотри, что важно: !isAuth и isAuth && hasSubscription читаются как бизнес-правила, а не как случайный набор символов.

Частые ошибки новичков

  • Путать && и || в сложных условиях.
  • Не учитывать короткое замыкание и побочные эффекты.
  • Полагаться на truthy/falsy там, где нужна строгая проверка.
  • Писать длинные условия без промежуточных переменных.

Анти-провал: сложное условие лучше разбить на const isAllowed = ..., const isPremium = ....

Что будет, если изменить вход

В getScreen:

  • isBlocked=true -> всегда blocked;
  • isBlocked=false, isAuth=false -> auth-required;
  • isAuth=true, hasSubscription=true -> full;
  • isAuth=true, hasSubscription=false -> limited.

Проверь себя: почему проверка isBlocked должна быть первой?

Краткий итог

  • Логические операторы соединяют и инвертируют условия.
  • &&, ||, ! лежат в основе всех сложных ветвлений.
  • Короткое замыкание важно понимать для корректности и производительности.
  • Truthy/falsy удобно, но требует осторожности на граничных данных.
  • Читаемые логические выражения напрямую повышают надежность бизнес-логики.