В JavaScript сть некоторые операции, которые могут применяться к самим логическим значениям. JavaScript поддерживает три логических оператора: и, или, и нет. Они могут быть использованы для «рассуждения» о логических значениях.
Оператор "&&" представляет логические "И". Это бинарный оператор, и его результат является истинным, только если оба значения, заданные ему, являются истинными.
console.log(true && false)
// → false
console.log(true && true)
// → true
Оператор " || "обозначает логический "или". Он выдает истину, если любое из значений, переданных ему, является истиной.
console.log(false || true)
// → true
console.log(false || false)
// → false
Восклицательный знак "!". Это унарный оператор, который переворачивает значение, заданное ему- "!true" производит "false", а "!false" дает "true".
При смешивании этих булевых операторов с арифметическими и другими операторами не всегда очевидно, когда нужны скобки. На практике, как правило, можно узнать, что из операторов, которые мы видели до сих пор, "||" имеет самый низкий приоритет, затем идет "&&", затем операторы сравнения (>, ==, и так далее), а затем остальные. Этот порядок был выбран таким образом, что в типичных выражениях, подобных следующему, необходимо заключать как можно меньше скобок:
1 + 1 == 2 && 10 * 10 > 50
Последний логический оператор не унарный, не двоичный, а троичный, работающий с тремя значениями. Это написано с вопросительным знаком и двоеточием, например:
console.log(true ? 1 : 2);
// → 1
console.log(false ? 1 : 2);
// → 2
Этот оператор называется условным оператором (или иногда просто троичным оператором, поскольку он является единственным таким оператором в языке). Значение слева от вопросительного знака «выбирает», какое из двух других значений выйдет. Когда оно истинно, оно выбирает среднее значение, а когда оно ложно, оно выбирает значение справа.
Пустые значения
Есть два специальных значения, записанных как "null" и "undefined", которые используются для обозначения отсутствия значимых значений. Они сами являются ценными, но они не несут никакой информации.
Многие операции на языке, которые не дают значимого значения, приводят к неопределенности просто потому, что они должны давать какое-то значение.
Разница в значении между "undefined" и "null" является случайностью дизайна JavaScript, и в большинстве случаев это не имеет значения. В тех случаях, когда вам действительно нужно заботиться об этих значениях, я рекомендую рассматривать их как взаимозаменяемые.
Короткое замыкание логических операторов
Логические операторы "&&" и " || " обрабатывать значения различных типов особым образом. Они преобразуют значение в левой части в логический тип, чтобы решить, что делать, но в зависимости от оператора и результата этого преобразования они вернут либо исходное левое значение, либо правое значение.
Оператор " || " , например, вернет значение слева от него, когда оно может быть преобразовано в "true", и вернет значение справа от него. Это имеет ожидаемый эффект, когда значения являются логическими, и делает что-то аналогичное для значений других типов, например:
console.log(null || "user")
// → user
console.log("Agnes" || "user")
// → Agnes
Можно использовать эту функциональность как способ возврата к значению по умолчанию. Если у вас есть значение, которое может быть пустым, вы можете поставить " || "после этого для восстановления. Если начальное значение может быть преобразовано в "false", вы получите замену вместо этого.
Правила преобразования строк и чисел в логические значения гласят, что 0, NaN и пустая строка ("") считаются ложными, тогда как все остальные значения считаются истинными. Итак, "0 || -1" производит "-1", а "" || "!?" дает "!?"
Оператор "&&" работает аналогично, но наоборот. Когда значение слева от него конвертируется в "false", оно возвращает это значение, а в противном случае возвращает значение справа.
Другим важным свойством этих двух операторов является то, что часть их права оценивается только при необходимости. В случае "true || X", независимо от того, что X - даже если это часть программы, которая делает что-то не верное - результат будет верным, и X никогда не оценивается. То же самое относится к "falce && X", которое является ложным и будет игнорировать X. Это называется оценкой короткого замыкания.
Условный оператор работает аналогичным образом. Из второго и третьего значений оценивается только выбранное.