Логические операторы
Всем приветос! Погнали!
Сегодня тема тоже очень важная и одна из фундаментальных. А поговорим мы о...
Логические операторы
Че же это за чижи такие и в какое гнездо они уперлись, спросишь ты, а я тебе отвечу – без этих чижов в любом ЯП делать не фига.
Приготовься, т.к. их существует огромное множество, а если быть точным, то... 3 =) Всего три! Успокойся, чего напрягся)
Вот они все: ||
, &&
, !
Пошли по-порядку.
Оператор || (ИЛИ)
Представляет из себя две палки колбасы и, если, его называть по-русски, читая код, то он читается как "ИЛИ". Он используется всегда с 2-мя операндами(аргументами), т.е. является бинарным.
Результат работы этого оператора – логическое значение true
или false
.
Если хотя бы один из операндов(аргументов) дает логическое true
, то и все выражение в целом будет возвращать истину. Пример:
let a = false; let b = true; if (a || b) { alert('Я буду появляться всегда, т.к. один из аргументов возвращает логическое значение: true '); } else { alert('Я никогда не появлюсь в данном случае'); }
Из примера понятно, что, если один из аргументов возвращает true
, то все выражение в условии возвращает истину. Еще один пример:
let a = 1; let b = 0; if (a || b) { alert('Я буду появляться всегда, т.к. один из аргументов возвращает логическое значение: true '); } else { alert('Я никогда не появлюсь в данном случае'); }
Здесь все отработает ровно так же. После приведения типов, переменная a выдаст значение true
, а переменная b
вернет значение false
, но т.к., выполнилось правило и один из аргументов возвращает true
, то это означает, что условие будет выполнено.
Чтобы условие с оператором ||
не выполнилось нужно, чтобы оба операнда(аргумента) возвращали false
.
Более-менее жизненный пример. Представь, что у тебя есть форум, на котором у каждого пользователя есть возможность прикреплять файлы к сообщению. Но эта возможность доступна не каждому пользователю, а только при выполнении определенных условий: пользователю не меньше 21 года или он написал более 500 сообщений. Код:
let ageUser = 18; let countMsgs = 800; if ((ageUser >= 21) || (countMsgs > 500)) { alert('Вам разрешено прикреплять файлы к сообщению'); } else { alert('Вам запрещено прикреплять файлы к сообщению'); }
Несмотря на то, что пользователю меньше 21 года условие выполнится, потому что он написал более 500 сообщений.
Еще пример:
let ageUser = 18; let countMsgs = 120; if ((ageUser >= 21) || (countMsgs > 500)) { alert('Вам разрешено прикреплять файлы к сообщению'); } else { alert('Вам запрещено прикреплять файлы к сообщению'); }
В этом случае условие не выполнится, потому что ни одно из условий внутри if
не вернуло логическое значение true
.
Оператор && (И)
Этот оператор более придирчивый чем ||
. Если оператору ИЛИ нужно хотя бы одно истинное значение, то оператор И не потерпит никаких false
– все должны быть true
и только так. Только когда все операнды возвращают значение true
оператор &&
вернет true
.
Пример:
alert(true && false); //вернет: false alert(false && false); //вернет: false alert(false && true); //вернет: false alert(true && true); //вернет: true
Возьмем тот же пример с форумом и переделаем под оператор И. Получается, что условия задачи меняются на эти: чтобы пользователь мог прикреплять файлы к сообщению ему должно быть больше 21 года и он должен написать более 500 сообщений.
let ageUser = 18; let countMsgs = 600; if ((ageUser >= 21) && (countMsgs > 500)) { alert('Вам разрешено прикреплять файлы к сообщению'); } else { alert('Вам запрещено прикреплять файлы к сообщению'); }
Здесь ты потерпишь фиаско, т.к., пользователю менее 21 года. Дальше JS даже второе условие проверять не будет, потому как первое уже зафейлилось и вернуло false
.
Оператор ! (НЕ)
Этот оператор не похож на первые два, но также очень важен.
Оператор является унарным, т.е., применяется он только к одному операнду(аргументу). Ставится оператор всегда перед аргументом!
Все что делает оператор можно описать в 2-ух шагах:
- Приводит операнд(аргумент) к логическому значению (true/false);
- Возвращает логическое значение противоположное тому, что получил в шаге 1.
Сразу же простой пример:
alert(!true); //вернет: false alert(!false); //вернет: true alert(!'string'); //вернет: false alert(!0); //вернет: true alert(!8); //вернет: false
Надеюсь все понятно. Поэтому сразу же перейду ко второй способности этого оператора. Можно взять и поставить два знака !!
перед аргументом. Что тогда произойдет? Не читай дальше, а подумай, основываясь на том, что ты уже прочитал про оператор. Итак... Барабанная дробь! А произойдет следующее:
- Первый знак ! приведет аргумент к логическому значению;
- Затем вернет противоположное логическое значение полученному в шаге 1 и на этом полномочия первого оператора НЕ - всё;
- Второй оператор НЕ проделает те же 2 шага и вторым шагом снова перевернет значению.
Какого лешего? Да... Тут все просто на самом деле. Это используют очень часто при преобразовании в логический тип, вместо функции Boolean(..)
. Сам подумай, насколько проще написать так:
let str = 'string'; let a = !!str;
Нежели так:
let str = 'string'; let a = Boolean(str);
В первом случае запись короче, а смысл абсолютно не меняется.
Домашняя работа
Задача:
Пользователю с помощью функции prompt предлагается ввести возраст.
Если возраст оказывается больше 18 лет, то с помощью еще одного prompt, нужно спросить как зовут пользователя.
Все эти данные нужно хранить в переменных.
Как только ты получишь от пользователя все эти данные, ты должен сделать следующие проверки: если пользователю больше 25 лет и его зовут Виталий, ты должен с помощью функции alert() вывести фразу "Привет Виталик, мы тебе рады!". В противном случае ты должен вывести ему фразу "Вы кто такие? Я вас не звал! Идите на ху...тор бабочек ловить!"