Когда Airbnb проверяет можно ли забронировать жильё: пользователь залогинен И верификация пройдена И даты свободны. Когда Netflix решает что показывать: фильм доступен в стране ИЛИ есть VPN-доступ. Когда кнопка "Оплатить" становится активной: корзина не пустая И адрес указан И способ оплаты выбран. Это всё логические операторы.
Операторы сравнения возвращают true или false. Логические операторы комбинируют несколько таких проверок в одном условии.
// Кнопка "Оплатить" активна только если ВСЕ условия выполнены
const canCheckout = isLoggedIn && cart.length > 0 && hasAddressКороткое замыкание (short-circuit): && останавливается на первом false:
// loadUserData() не вызовется если isLoggedIn = false
isLoggedIn && loadUserData()// Бесплатная доставка при заказе > 2000 ИЛИ при наличии подписки
const hasFreeShipping = cartTotal >= 2000 || hasPremiumSubscriptionКороткое замыкание: || останавливается на первом true:
// Значение по умолчанию (классический паттерн)
const displayName = user.name || 'Аноним'
const theme = userSettings.theme || 'light'const isLoggedOut = !isLoggedIn
const isEmpty = !items.length // 0 — falsy, !0 = true
const isNotAdmin = !user.isAdmin! выполняется первым, потом &&, потом ||:
// Это:
a || b && c
// Читается как:
a || (b && c) // && связывает крепче
// Используй скобки чтобы сделать явным:
(a || b) && c // другой результат!|| заменяет любой 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. Логические операторы комбинируют несколько таких проверок в одном условии.
// Кнопка "Оплатить" активна только если ВСЕ условия выполнены
const canCheckout = isLoggedIn && cart.length > 0 && hasAddressКороткое замыкание (short-circuit): && останавливается на первом false:
// loadUserData() не вызовется если isLoggedIn = false
isLoggedIn && loadUserData()// Бесплатная доставка при заказе > 2000 ИЛИ при наличии подписки
const hasFreeShipping = cartTotal >= 2000 || hasPremiumSubscriptionКороткое замыкание: || останавливается на первом true:
// Значение по умолчанию (классический паттерн)
const displayName = user.name || 'Аноним'
const theme = userSettings.theme || 'light'const isLoggedOut = !isLoggedIn
const isEmpty = !items.length // 0 — falsy, !0 = true
const isNotAdmin = !user.isAdmin! выполняется первым, потом &&, потом ||:
// Это:
a || b && c
// Читается как:
a || (b && c) // && связывает крепче
// Используй скобки чтобы сделать явным:
(a || b) && c // другой результат!|| заменяет любой 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