> For the complete documentation index, see [llms.txt](https://thedvlpr.gitbook.io/javascript-for-dummies/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://thedvlpr.gitbook.io/javascript-for-dummies/logicheskie-operatory.md).

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

JavaScript простым языком

[![Generic badge](https://img.shields.io/badge/JavaScript-%D0%B4%D0%BB%D1%8F%20%D1%82%D1%83%D0%BF%D1%8B%D1%85-green.svg)](https://img.shields.io/badge/JavaScript-%D0%B4%D0%BB%D1%8F%20%D1%82%D1%83%D0%BF%D1%8B%D1%85-green.svg)

![](https://3367117456-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M8VRUyYIp5X-d6oGwV2%2F-M8VrcqQSYptdd3-_i0t%2F-M8VrtHZraykVgiI4Hu3%2Fimg-15.png?alt=media\&token=8f16bb26-baa6-4205-8035-1e9c5d5900e9)

Тема тоже очень важная и одна из **фундаментальных**.&#x20;

#### **Логические операторы** <a href="#toc_1" id="toc_1"></a>

Существует всего **три логических оператора**.

Логические операторы: `||`, `&&`, `!`

Идём по порядку.

#### **Оператор || (ИЛИ)** <a href="#toc_2" id="toc_2"></a>

Данный оператор представляет собой две палки ~~колбасы~~ и, если, его называть по-русски, читая код, то он читается как **ИЛИ**. Он используется всегда с 2-я операндами (аргументами), т.е. является **бинарным**.

Результат работы этого оператора – логическое значение `true` или `false`.

Если хотя бы один из операндов (аргументов) дает логическое `true`, то и всё выражение в целом будет возвращать `истину`. Пример:

```javascript
let a = false;
let b = true;

if (a || b) {
  alert('Я буду появляться всегда, т.к. один из аргументов \
  возвращает логическое значение: true ');
} else {
  alert('Я никогда не появлюсь в данном случае');
}
```

Из примера понятно, что, если один из аргументов возвращает `true`, то все выражение в условии возвращает `истину`. Еще один пример:

```javascript
let a = 1;
let b = 0;

if (a || b) {
  alert('Я буду появляться всегда, т.к. один из аргументов \
  возвращает логическое значение: true ');
} else {
  alert('Я никогда не появлюсь в данном случае');
}
```

Здесь все отработает ровно так же. После приведения типов, переменная `a` выдаст значение `true`, а переменная `b` вернет значение `false`, но т.к., выполнилось правило и один из аргументов возвращает `true`, то это означает, что условие будет выполнено.

Чтобы условие с оператором `||` не выполнилось нужно, чтобы оба операнда (аргумента) возвращали `false`.

Более или менее жизненный пример. Представь, у тебя есть форум, на котором у каждого пользователя есть возможность прикреплять файлы к сообщению. Но эта возможность доступна не каждому пользователю, а только при выполнении определенных условий: *пользователю не меньше `21` года или он написал более `500`сообщений*.&#x20;

Код:

```javascript
let ageUser = 18;
let countMsgs = 800;

if ((ageUser >= 21) || (countMsgs > 500)) {
  alert('Вам разрешено прикреплять файлы к сообщению');
} else {
  alert('Вам запрещено прикреплять файлы к сообщению');
}
```

Несмотря на то, что пользователю `меньше 21` года условие выполнится, потому что он написал **более** `500 сообщений`.

Еще пример:

```javascript
let ageUser = 18;
let countMsgs = 120;

if ((ageUser >= 21) || (countMsgs > 500)) {
  alert('Вам разрешено прикреплять файлы к сообщению');
} else {
  alert('Вам запрещено прикреплять файлы к сообщению');
}
```

В этом случае условие не выполнится, потому что ни одно из условий внутри `if` не вернуло логическое значение `true`.

#### **Оператор && (И)** <a href="#toc_3" id="toc_3"></a>

Этот оператор более придирчивый чем `||`. Если оператору **ИЛИ**  нужно хотя бы **одно истинное значение**, то оператор **И** не потерпит никаких `false` – всё должно быть `true` и только так. Только когда все операнды возвращают значение `true`, оператор `&&`вернет `true`.

Пример:

```javascript
alert(true && false); // вернет: false
alert(false && false); // вернет: false
alert(false && true); // вернет: false
alert(true && true); // вернет: true
```

Возьмем тот же пример с форумом и переделаем под оператор **И**. Получается, что условия задачи меняются: чтобы пользователь мог прикреплять файлы к сообщению ему должно быть `больше 21` года и он должен написать `более` `500 сообщений`.&#x20;

```javascript
let ageUser = 18;
let countMsgs = 600;

if ((ageUser >= 21) && (countMsgs > 500)) {
  alert('Вам разрешено прикреплять файлы к сообщению');
} else {
  alert('Вам запрещено прикреплять файлы к сообщению');
}
```

Здесь ты потерпишь фиаско, т.к., пользователю `менее 21` года. Дальше **JavaScript** даже второе условие проверять не будет, потому как первое уже **зафейлилось** и вернуло `false`.

#### **Оператор ! (НЕ)** <a href="#toc_4" id="toc_4"></a>

Данный оператор не похож на первые два, но также очень важен.

Оператор является **унарным**, т.е., применяется он только к одному операнду (аргументу). Ставится оператор всегда перед аргументом.

Все что делает оператор можно описать в **2-х шагах**:

1. Приводит операнд (аргумент) к логическому значению (`true/false`);
2. Возвращает логическое значение противоположное тому, что получил в шаге `1`.

Сразу же простой пример:

```javascript
alert(!true); // вернет: false
alert(!false); // вернет: true
alert(!'string'); // вернет: false
alert(!0); // вернет: true
alert(!8); // вернет: false
```

Надеюсь все понятно. Поэтому сразу же перейду ко второй способности этого оператора. Можно взять и поставить два знака `!!` перед аргументом. Что произойдет в этом случае? Не читай ответ, а подумай, основываясь на том, что ты уже прочитал об операторе. Итак, барабанная дробь! А произойдет следующее:

1. Первый знак `!` приведет аргумент к логическому значению;
2. Затем вернет противоположное логическое значение полученное в шаге `1` и на этом полномочия первого оператора **НЕ** завершатся;
3. Второй оператор **НЕ** проделает те же `2` шага и вторым шагом снова приведет к значению (вернув его).

Да что за…? Да-да, здесь все просто на самом деле. Данный метод используют очень часто при **преобразовании в логический тип**, вместо функции `Boolean(..)`. Сам подумай, насколько проще написать так:

```javascript
let str = 'string';
let a = !!str;
```

Нежели так:

```javascript
let str = 'string';
let a = Boolean(str);
```

В первом случае запись короче, а смысл абсолютно не меняется.

#### **Домашнее задание** <a href="#toc_5" id="toc_5"></a>

**Задача:**

Пользователю с помощью функции `prompt` предлагается ввести `возраст`.

Если возраст `больше 18` лет, то с помощью еще одного `prompt`, нужно запросить имя пользователя.

Все эти данные нужно сохранить в `переменных`.

Как только ты получишь от пользователя все необходимые данные, ты должен сделать следующие проверки: **если** пользователю `больше 25` лет и его `имя John`, ты должен с помощью функции `alert()`вывести фразу `"Welcome, John"`. В противном случае ты должен вывести ему фразу `"Who are you? I don't know you"`.
