JavaScript: Отрицание

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

!true; // false
!false; // true

Например, если есть функция, проверяющая чётность числа, то с помощью отрицания можно выполнить проверку нечётности:

const isEven = (number) => number % 2 === 0;

isEven(10); // true
!isEven(10); // false

Мы просто добавили ! слева от вызова функции и получили обратное действие. Отрицание позволяет выражать задуманные правила в коде без написания новых функций.

Двойное отрицание

А что, если написать !!isEven(10)? Внезапно, но код сработает. В логике двойное отрицание равносильно отсутствию отрицания:

isEven(10); // true
!isEven(10); // false
!!isEven(10); // true

Комбинирование с && и ||

! можно комбинировать с && и ||. Среди логических операторов у отрицания наивысший приоритет, поэтому оно применяется первым:

!true || true; // (!true) || true   => false || true  => true
!true && false; // (!true) && false  => false && false => false

Скобки меняют порядок вычисления:

!(true || true); // !true  => false
!(true && false); // !false => true

Практический пример — функция проверяет, может ли водитель сесть за руль: нужны права и трезвость:

const canDrive = (hasLicense, isDrunk) => hasLicense && !isDrunk;

console.log(canDrive(true, false)); // => true  (есть права, трезвый)
console.log(canDrive(true, true)); // => false (есть права, но пьяный)
console.log(canDrive(false, false)); // => false (нет прав)

Законы де Моргана

При работе со сложными логическими выражениями бывает нужно инвертировать их или переписать в эквивалентную, более читаемую форму. Для этого существуют законы де Моргана — два правила, описывающих, как отрицание распределяется по составному выражению:

!(a && b) === !a || !b;
!(a || b) === !a && !b;

Первый закон: отрицание конъюнкции равно дизъюнкции отрицаний. Проверим:

!(true && false); // !false => true
!true || !false; // false || true => true

Второй закон: отрицание дизъюнкции равно конъюнкции отрицаний:

!(true || false); // !true => false
!true && !false; // false && true => false

На практике законы де Моргана помогают упрощать условия. Например, вместо !(isAdmin || isModerator) можно написать !isAdmin && !isModerator — читается как «не администратор и не модератор».

Задание

Напишите две функции:

  1. isPalindrome(str) — возвращает true, если строка является палиндромом (читается одинаково в обоих направлениях).
  2. isNotPalindrome(str) — возвращает true, если строка не является палиндромом.
isPalindrome("level"); // => true
isPalindrome("hello"); // => false
isNotPalindrome("level"); // => false
isNotPalindrome("hello"); // => true

// Строки в функции могут быть переданы в любом регистре
// Поэтому сначала приведите строку к нижнему регистру методом .toLowerCase()
isPalindrome("Wow"); // => true
isNotPalindrome("Wow"); // => false

Используйте метод .split(''), .reverse(), .join('') для разворота строки.

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются