← JavaScript/Логические операторы#60 из 383← ПредыдущийСледующий →+20 XP
Полезно по теме:Гайд: как учить JavaScriptПрактика: JS базаПрактика: async и сетьТермин: Closure

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

Когда Airbnb проверяет можно ли забронировать жильё: пользователь залогинен И верификация пройдена И даты свободны. Когда Netflix решает что показывать: фильм доступен в стране ИЛИ есть VPN-доступ. Когда кнопка "Оплатить" становится активной: корзина не пустая И адрес указан И способ оплаты выбран. Это всё логические операторы.

На основе предыдущих уроков

Операторы сравнения возвращают true или false. Логические операторы комбинируют несколько таких проверок в одном условии.

&& (И) — оба условия должны быть true

// Кнопка "Оплатить" активна только если ВСЕ условия выполнены
const canCheckout = isLoggedIn && cart.length > 0 && hasAddress

Короткое замыкание (short-circuit): && останавливается на первом false:

// loadUserData() не вызовется если isLoggedIn = false
isLoggedIn && loadUserData()

|| (ИЛИ) — хотя бы одно условие true

// Бесплатная доставка при заказе > 2000 ИЛИ при наличии подписки
const hasFreeShipping = cartTotal >= 2000 || hasPremiumSubscription

Короткое замыкание: || останавливается на первом true:

// Значение по умолчанию (классический паттерн)
const displayName = user.name || 'Аноним'
const theme = userSettings.theme || 'light'

! (НЕ) — инвертирует boolean

const isLoggedOut = !isLoggedIn
const isEmpty = !items.length  // 0 — falsy, !0 = true
const isNotAdmin = !user.isAdmin

Порядок приоритетов

! выполняется первым, потом &&, потом ||:

// Это:
a || b && c
// Читается как:
a || (b && c)  // && связывает крепче

// Используй скобки чтобы сделать явным:
(a || b) && c  // другой результат!

|| vs ?? — важное отличие

|| заменяет любой falsy: false, 0, '', null, undefined

?? заменяет только null и undefined (следующий урок)

const count = 0
const display1 = count || 'нет данных'  // 'нет данных' — неверно! 0 валидно
const display2 = count ?? 'нет данных'  // 0 — правильно

Типичные ошибки

Ошибка 1: Перепутать && и || в сложных условиях

// Хотели: (admin ИЛИ moderator) И залогинен
const canEdit = user.role === 'admin' || user.role === 'moderator' && user.isLoggedIn
// Получили: admin ИЛИ (moderator И залогинен) — из-за приоритета &&!

// Правильно:
const canEdit = (user.role === 'admin' || user.role === 'moderator') && user.isLoggedIn

Ошибка 2: || не работает для нулевых значений

const score = 0
const label = score || 'нет результата'  // 'нет результата' — но 0 это валидный счёт!
const label2 = score ?? 'нет результата' // 0 — используй ??

Ошибка 3: Слишком длинные цепочки условий без разбивки

// Нечитаемо:
if (a && b && c && d && e && f) { ... }

// Лучше — вынести в переменную с говорящим именем:
const isEligibleForDiscount = isLoggedIn && hasOrders && totalSpent > 5000
if (isEligibleForDiscount) { ... }

В реальных проектах

Логические операторы — основа системы прав доступа (RBAC), валидации форм, условного рендеринга в React (isLoggedIn && <Dashboard />), и вычисляемых свойств во Vue.

Примеры

Система проверок при оформлении заказа

const user = {
  id: 'usr_42',
  name: 'Алексей',
  isLoggedIn: true,
  isVerified: true,
  role: 'customer',
  address: 'Москва, ул. Ленина 1',
  age: 28,
}

const cart = {
  items: ['Ноутбук', 'Мышь'],
  total: 3500,
}

// Может ли пользователь оформить заказ?
const canCheckout = user.isLoggedIn && user.isVerified && cart.items.length > 0
console.log('Можно оформить:', canCheckout)  // true

// Бесплатная доставка?
const hasFreeShipping = cart.total >= 2000 || user.role === 'premium'
console.log('Бесплатная доставка:', hasFreeShipping)  // true

// Может ли смотреть контент 18+?
const canViewAdult = user.isVerified && user.age >= 18
console.log('Контент 18+:', canViewAdult)  // true

// Имя или заглушка (паттерн default value)
const displayName = user.name || 'Гость'
console.log('Показываем:', displayName)  // 'Алексей'

// Условный вызов — загружаем данные только если залогинен
user.isLoggedIn && console.log('Загружаем профиль для', user.name)

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

Когда Airbnb проверяет можно ли забронировать жильё: пользователь залогинен И верификация пройдена И даты свободны. Когда Netflix решает что показывать: фильм доступен в стране ИЛИ есть VPN-доступ. Когда кнопка "Оплатить" становится активной: корзина не пустая И адрес указан И способ оплаты выбран. Это всё логические операторы.

На основе предыдущих уроков

Операторы сравнения возвращают true или false. Логические операторы комбинируют несколько таких проверок в одном условии.

&& (И) — оба условия должны быть true

// Кнопка "Оплатить" активна только если ВСЕ условия выполнены
const canCheckout = isLoggedIn && cart.length > 0 && hasAddress

Короткое замыкание (short-circuit): && останавливается на первом false:

// loadUserData() не вызовется если isLoggedIn = false
isLoggedIn && loadUserData()

|| (ИЛИ) — хотя бы одно условие true

// Бесплатная доставка при заказе > 2000 ИЛИ при наличии подписки
const hasFreeShipping = cartTotal >= 2000 || hasPremiumSubscription

Короткое замыкание: || останавливается на первом true:

// Значение по умолчанию (классический паттерн)
const displayName = user.name || 'Аноним'
const theme = userSettings.theme || 'light'

! (НЕ) — инвертирует boolean

const isLoggedOut = !isLoggedIn
const isEmpty = !items.length  // 0 — falsy, !0 = true
const isNotAdmin = !user.isAdmin

Порядок приоритетов

! выполняется первым, потом &&, потом ||:

// Это:
a || b && c
// Читается как:
a || (b && c)  // && связывает крепче

// Используй скобки чтобы сделать явным:
(a || b) && c  // другой результат!

|| vs ?? — важное отличие

|| заменяет любой falsy: false, 0, '', null, undefined

?? заменяет только null и undefined (следующий урок)

const count = 0
const display1 = count || 'нет данных'  // 'нет данных' — неверно! 0 валидно
const display2 = count ?? 'нет данных'  // 0 — правильно

Типичные ошибки

Ошибка 1: Перепутать && и || в сложных условиях

// Хотели: (admin ИЛИ moderator) И залогинен
const canEdit = user.role === 'admin' || user.role === 'moderator' && user.isLoggedIn
// Получили: admin ИЛИ (moderator И залогинен) — из-за приоритета &&!

// Правильно:
const canEdit = (user.role === 'admin' || user.role === 'moderator') && user.isLoggedIn

Ошибка 2: || не работает для нулевых значений

const score = 0
const label = score || 'нет результата'  // 'нет результата' — но 0 это валидный счёт!
const label2 = score ?? 'нет результата' // 0 — используй ??

Ошибка 3: Слишком длинные цепочки условий без разбивки

// Нечитаемо:
if (a && b && c && d && e && f) { ... }

// Лучше — вынести в переменную с говорящим именем:
const isEligibleForDiscount = isLoggedIn && hasOrders && totalSpent > 5000
if (isEligibleForDiscount) { ... }

В реальных проектах

Логические операторы — основа системы прав доступа (RBAC), валидации форм, условного рендеринга в React (isLoggedIn && <Dashboard />), и вычисляемых свойств во Vue.

Примеры

Система проверок при оформлении заказа

const user = {
  id: 'usr_42',
  name: 'Алексей',
  isLoggedIn: true,
  isVerified: true,
  role: 'customer',
  address: 'Москва, ул. Ленина 1',
  age: 28,
}

const cart = {
  items: ['Ноутбук', 'Мышь'],
  total: 3500,
}

// Может ли пользователь оформить заказ?
const canCheckout = user.isLoggedIn && user.isVerified && cart.items.length > 0
console.log('Можно оформить:', canCheckout)  // true

// Бесплатная доставка?
const hasFreeShipping = cart.total >= 2000 || user.role === 'premium'
console.log('Бесплатная доставка:', hasFreeShipping)  // true

// Может ли смотреть контент 18+?
const canViewAdult = user.isVerified && user.age >= 18
console.log('Контент 18+:', canViewAdult)  // true

// Имя или заглушка (паттерн default value)
const displayName = user.name || 'Гость'
console.log('Показываем:', displayName)  // 'Алексей'

// Условный вызов — загружаем данные только если залогинен
user.isLoggedIn && console.log('Загружаем профиль для', user.name)

Задание

Ты пишешь систему проверки для оформления заказа. Функция canCheckout принимает пользователя и корзину и возвращает true только если: пользователь залогинен И корзина не пуста И у пользователя указан адрес доставки.

Подсказка

user.isLoggedIn && cart.items.length > 0 && user.address !== null

Загружаем среду выполнения...
Загружаем AI-помощника...