Логические операторы
Логические операторы объединяют несколько условий в одно: «возраст больше 18 и есть билет», «выходной или праздник». Результат обычно — true или false, и его используют в if.
И — &&
Оператор && даёт true, только когда истинны обе части:
console.log(true && false); // falseНа практике по обе стороны стоят сравнения:
const age = 20;
const hasTicket = true;
console.log(age >= 18 && hasTicket); // trueИЛИ — ||
Оператор || даёт true, когда истинна хотя бы одна часть. Ложь получается, только если ложны обе:
const day = 'суббота';
console.log(day === 'суббота' || day === 'воскресенье'); // trueНЕ — !
Оператор ! переворачивает значение: истину делает ложью, а ложь — истиной. Он ставится перед значением:
const isLoggedIn = false;
console.log(!isLoggedIn); // trueУдобно читать ! как «не»: !isLoggedIn — «не вошёл в систему».
Приоритет
! выполняется первым, затем &&, и только потом || — так же, как умножение выполняется раньше сложения. В сложных условиях лучше расставить скобки, чтобы порядок был виден сразу:
const isAdmin = false;
const isOwner = true;
const isBlocked = false;
console.log((isAdmin || isOwner) && !isBlocked); // trueЗначение по умолчанию
На самом деле || возвращает не просто true или false, а одно из своих значений: первое истинное или последнее. Этим пользуются, чтобы подставить запасное значение:
const nickname = '';
console.log(nickname || 'Гость'); // ГостьПохожий оператор ?? возвращает правую часть, только если левая равна null или undefined. Ноль и пустую строку он считает нормальными значениями:
const count = 0;
console.log(count || 10); // 10
console.log(count ?? 10); // 0Если ноль — допустимое значение, например количество товаров, используйте ??.
Частая ошибка
Нельзя сравнить переменную сразу с несколькими значениями, перечислив их через ||. Правая часть здесь — просто непустая строка, а она всегда истинна:
const day = 'понедельник';
console.log(day === 'суббота' || 'воскресенье'); // воскресеньеСравнение нужно повторить для каждого значения: day === 'суббота' || day === 'воскресенье'.