1. Двоичная логика
Любая программа может быть создана на основе нескольких принципов: последовательности выполнения и ветвлений.
Последовательность выполнения — следование записи кода сверху вниз. Но не всегда программа должна выполняться строго последовательно. Для изменения последовательности используются циклы и ветвления.
Ветвление — возможность выполнить ту или иную последовательность кода в
зависимости от условия. Условие может быть любым, но результат его проверки
всегда будет одним из двух значений true или false.
Компьютер использует бинарный (от латинского bis - дважды) код. Т.е. всего два
значения используются для создания любых программ: 0 и 1. Это значит, что
условия также задаются в виде 0 (нет, false) и 1 (да, true).
В математике существует раздел булевой логики, в котором условия бинарны, т.е.
могут быть представлены в виде 0 и 1, а также в виде слов true и false.
Именно эта логика используется для реализации ветвления.
1.1. Приведение типов
Для того чтобы работала булева логика необходимо на входе иметь два значения.
Поэтому в JavaScript, в логических операциях, осуществляется приведение типов
операндов к true или false. Приведение происходит если в коде обнаружен
логический оператор.
Truthy и Falsy — термины, которые используются для тех значений,
которые, в логической операции, приводятся к true или false, хотя изначально
не были булями.
Запомните 6 ложных (falsy) значений, приводящихся к
false в логическом преобразовании: 0, NaN, null, undefined, пустая
строка: "" или '', false. Абсолютно все остальное приводится к true.
2. Логические операторы
Есть три логических оператора, которые используются для проверки выполнения множественных выражений.

2.1. Логическое «И»
Оператор && приводит все операнды к булю и возвращает одно из значений
(операндов). Левый операнд если его можно привести к false, и правый в
остальных случаях.
const num = 20;
const result = num > 10 && num < 30;
console.log(result); // true
В коде выше мы проверяем условие: переменная num больше 10 и меньше 30.
Так как оба условия вернут true, то и результатом всего выражения будет
true.
Для того чтобы оператор && вернул true, требуется чтобы все операнды были
истинными (truthy). Если хотя бы один из операндов будет приведен к false, то
результатом выражения будет этот операнд.
const num = 40;
const result = num > 10 && num < 30;
console.log(result); // false
2.2. Логическое «ИЛИ»
Оператор || возвращает одно из значений (операндов). Левый операнд если его
можно привести к true, и правый в остальных случаях.
const num = 5;
const result = num < 10 || num > 30;
console.log(result); // true
Это тоже будет true так как хотя бы один из операндов был приведен к true.
const num = 40;
const result = num < 10 || num > 30;
console.log(result); // true
А тут ни одно из условий не выполняется, поэтому получаем false.
const num = 20;
const result = num < 10 || num > 30;
console.log(result); // false
2.3. Логическое «НЕ»
Оператор ! приводит операнд к булю, если необходимо, а затем заменяет его на
противоположный.
console.log(!true); // false
console.log(!false); // true
console.log(!1); // false
console.log(!0); // true
2.4. Порядок вычисления
При выполнении логических операций, правый операнд может не вычисляться.

"Купить билет И отдохнуть" - если левый операнд "Купить билет" окажется
false, то вычислять второй нет смысла.
false && (этот операнд не вычисляется)
"Отдохнуть ИЛИ сохранить деньги" - если левый операнд "Отдохнуть" окажется
true, то вычислять второй нет смысла.
true || (этот операнд не вычисляется)