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

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

Логические операторы выступают в роли особенных символов, предназначенных для объединения или изменения логических выражений. В языке программирования JavaScript есть четыре основных логических оператора: «и» (`&&`), «или» (`||`), «не» (`!`) и оператор нулевого слияния (`??`).

Истинные и ложные значения

Истинные значения — это значения, которые при приведении к логическому типу с помощью функции Boolean( ) выведут true, например:

const num = 7;
console.log(Boolean(num)) // выведет true

Ложные значения — это значения, которые при приведении к логическому типу выводят false. В логическом преобразовании существует шесть ложных значений: false, null, undefined, NaN, пустая строка и 0. Все остальное приводится к true.

Оператор «и» (`&&`)

JavaScript Оператор «и» возвращает последнюю истину, когда оба его операнда истинны. Если хотя бы один из операндов ложный — возвращается первая ложь. В случае если левый операнд был приведен к false, правый может не вычисляться.

let a = true;
let b = false;
let e = a && b;   // e = false, так как один из операндов false
let d = a && true;   // d = true, так как оба операнда true

Логическое «и» запинается на лжи и возвращает то, на чем остановилось. Если ложных значений нет — выводится последний операнд.

let a = "Апельсин";
let b = 0;
let c = 7;
let d = a && b;   // d = 0
let e = a && c;   // e = 7

Оператор `&&` обладает более высоким приоритетом по сравнению с оператором `||`(«или»), что гарантирует его выполнение в первую очередь. Рассмотрим пример:

let a = "Апельсин";
let b = 0;
let c = 7;
let f = a || b && c;   // f = "Апельсин", сначала выполняется И, а потом ИЛИ
let g = (a || b) && c;   // g = 7, сначала выполняется то, что в скобках

Оператор «и» используется для проверки нескольких условий одновременно. Например, мы хотим выполнить какое-то действие только тогда, когда пользователь авторизован и находится онлайн:

if (user.isAuthorized && user.isOnline) {
// выполнить действие
}

Оператор «или» (`||`)

Оператор JS «или» гарантирует возврат истины в случае, когда один из операндов является истинным. Если оба операнда истинны, то возвращается первая истина. Когда оба операнда ложны, «или» возвращает последнюю ложь:

let a = true;
let b = false;
let c = a || b;   // c = true, так как один из операндов true
let d = false || false;   // d = false, так как оба операнда false

Оператор «или» может использоваться для задания альтернативного значения по умолчанию. К примеру, мы хотим присвоить переменной `name`значение параметра `nickname`, если он существует. Если его нет, то выводить строку "Тайный гость" в качестве значения по умолчанию:

let name = nickname || "Тайный гость";

Оператор «не» (`!`)

Оператор «не» обладает способностью инвертировать значение своего операнда, возвращая true при ложном операнде и false при истинном. Среди всех логических операторов, «не» обладает наивысшим приоритетом.

let a = true;
let b = !a;   // b = false, так как оператор `!` меняет значение на противоположное
let c = !false;   // c = true, так как оператор `!` меняет значение на противоположное
let d = !(a && b);   // d = true, так как сначала выполняется И, а потом `!`
let f = !a && b;   // d = false

Оператор «не» часто используется в if-else инструкциях. Представим, что нам надо выполнить действие тогда, когда переменная `isonline`имеет значение false. Но код в фигурных скобках в if-конструкции будет выполняться, только если в круглых скобках будет true значение. В этом случае оператор `!` приходит на помощь, создавая выражение в скобках с значением, противоположным значению переменной.

if (!isonline) {
// выполнение действия
}else {
// действие не выполнять
}

Оператор нулевого слияния (`??`)

Оператор нулевого слияния возвращает значение левого операнда, если он не `null` и не `undefined`, иначе возвращает значение правого операнда. Оператор нулевого слияния имеет меньший приоритет, чем операторы «и» и «или», то есть он выполняется после них.

let a = null;
let b = 42;
let c = a ?? b;   // c = 42, так как a равно null
let d = 0 ?? b;   // d = 0, так как 0 не равно null или undefined

Использование операторов `&&` и `||` вместе с оператором `??` в одном выражении приведет к ошибке SyntaxError. Чтобы этого не происходило, достаточно добавить приоритет с помощью круглых скобок:

let e = a && b ?? (a || b);
//Uncaught SyntaxError: Unexpected token '??'
let e = (a && b) ?? (a || b);
// e = 42, сначала выполняется ИЛИ, а потом нулевое слияние

Оператор нулевого слияния применяется, чтобы задать значение по умолчанию для переменных или параметров, которые могут быть равны `null` или `undefined`. Представим, что мы хотим присвоить переменной `name` значение параметра `nickname`, если он не равен `null` или `undefined`. Если  значение параметра `nickname` будет`null` или `undefined` — передим для `name` в качестве значения строку  "Тайный гость":

let name = nickname ?? "Тайный гость";