--- sidebar_position: 6 --- # Условия и логические операторы ## Условное ветвление: if, '?' Инструкция if(...) вычисляет условие в скобках и, если результат true, то выполняет блок кода. ***Несколько условий: «else if»*** ## Конструкция "switch" ``` let a = 2 + 2; switch (a) { case 3: alert( 'Маловато' ); break; case 4: alert( 'В точку!' ); break; case 5: alert( 'Перебор' ); break; default: alert( "Нет таких значений" ); } ``` ## Условный оператор „?“ (тернарный) ``` let result = условие ? значение1 : значение2; ``` ## Логические операторы В JavaScript есть семь логических операторов: - || (ИЛИ) - ||= (Оператор логического присваивания ИЛИ) - && (И) - &&= (Оператор логического присваивания И) - ! (НЕ) - ?? (Оператор нулевого слияния) - ??= (Оператор нулевого присваивания) ### || (ИЛИ) ``` ( true || true ); // true ( false || true ); // true ( true || false ); // true ( false || false ); // false ``` ### ИЛИ "||" находит первое истинное значение ``` ( 1 || 0 ); // 1 (1 - истинное значение) ( true || 'какая-то строка' ); // true ( null || 1 ); // 1 (первое истинное значение) ( null || 0 || 1 ); // 1 (первое истинное значение) ( undefined || null || 0 ); // 0 (поскольку все ложно, возвращается последнее значение) ``` ### ||= (Логическое присваивание ИЛИ) ``` a ||= b; ``` Оператор **||=** принимает два операнда и выполняет следующие действия: - Вычисляет операнды слева направо. - Конвертирует ***a*** в логическое значение. - Если ***a*** ложно, присваивает ***a*** значение ***b***. ### && (И) ``` ( true && true ); // true ( false && true ); // false ( true && false ); // false ( false && false ); // false ``` #### И «&&» находит первое ложное значение ``` result = value1 && value2 && value3; ``` Оператор **&&** выполняет следующие действия: - Вычисляет операнды слева направо. - Каждый операнд преобразует в логическое значение. Если результат **false**, останавливается и возвращает исходное значение этого операнда. - Если все операнды были истинными, возвращается последний. Другими словами, **И** возвращает первое ложное значение. Или последнее, если ничего не найдено. Вышеуказанные правила схожи с поведением **ИЛИ**. Разница в том, что **И** возвращает первое ложное значение, а **ИЛИ** первое истинное. ❗ ***Приоритет оператора && больше, чем у ||*** \ Приоритет оператора **И &&** больше, чем **ИЛИ ||**, так что он выполняется раньше. Таким образом, код **a && b || c && d** по существу такой же, как если бы выражения **&&** были в круглых скобках: **(a && b) || (c && d)** ❗ ***Не заменяйте if на || или &&*** \ Несмотря на то, что вариант с && кажется более коротким, if более нагляден и, как правило, более читабелен. ### &&= (Логическое присваивание И) ``` a &&= b; ``` Принцип действия **&&=** практически такой же, как и у оператора логического присваивания **ИЛИ ||=**. \ Единственное отличие заключается в том, что **&&=** присвоит **a** значение **b** только в том случае, если **a** истинно. ### ! (НЕ) ``` result = !value; ``` Оператор принимает один аргумент и выполняет следующие действия: 1. Сначала приводит аргумент к логическому типу **true/false**. 2. Затем возвращает противоположное значение. ❗ Приоритет **НЕ !** является наивысшим из всех логических операторов, поэтому он всегда выполняется первым, перед **&& ** или **||**. ### Оператор нулевого слияния (??) Результат выражения **a ?? b** будет следующим: - если **a** определено, то **a**, - если **a** не определено, то **b**. Иначе говоря, оператор **??** возвращает первый аргумент, если он не **null/undefined**, иначе второй. #### Сравнение с || Важное различие между ними заключается в том, что: - || возвращает первое истинное значение. - ?? возвращает первое определённое значение. Приоритет оператора ?? такой же, как и у ||. Они оба равны 3 в таблице на MDN. #### Использование ?? вместе с && или || По соображениям безопасности JavaScript запрещает использование оператора **??** вместе с **&&** и **||**, если приоритет явно не указан при помощи круглых скобок. ``` let x = 1 && 2 ?? 3; // Синтаксическая ошибка ``` Используйте скобки, чтобы обойти это ограничение: ``` let x = (1 && 2) ?? 3; // Работает без ошибок ``` ### Оператор нулевого присваивания (??=) Предположим, нам необходимо проверить, равна ли переменная null или undefined, и если это так — присвоить этой переменной какое-либо другое значение. ``` let userAge = null; if (userAge === null || userAge === undefined) { userAge = 18; } ``` Выглядит громоздко, правда? Существует оператор, более подходящий для подобных задач. ```x ??= y``` Оператор **??=** присвоит **x** значение **y** только в том случае, если **x** не определено (null/undefined). ``` let userAge = null; userAge ??= 18; alert(userAge) // 18 ```