Оператор ! в JavaScript

Оператор ! означает логическое «не». Он превращает значение в противоположное булево значение.

console.log(!true);
console.log(!false);

Результат:

false
true

Если значение было истинным, после ! получится false. Если значение было ложным, получится true.

Что делает оператор !

Оператор ! сначала приводит значение к boolean, а потом меняет его на противоположное.

console.log(!1);
console.log(!0);
console.log(!'JavaScript');
console.log(!'');

Результат:

false
true
false
true

Число 1 и непустая строка считаются truthy, поэтому после отрицания становятся false. Число 0 и пустая строка считаются falsy, поэтому после отрицания становятся true.

Синтаксис

!значение

Оператор ! пишется перед значением или выражением.

let isLoggedIn = false;

console.log(!isLoggedIn);

Результат:

true

Переменная isLoggedIn равна false, поэтому выражение !isLoggedIn возвращает true.

Оператор ! в условиях

Чаще всего ! используют в if, когда нужно проверить обратную ситуацию.

let isLoggedIn = false;

if (!isLoggedIn) {
  console.log('Войдите в аккаунт');
}

Можно прочитать так: если пользователь не вошел в аккаунт, покажи сообщение.

Еще один пример:

let hasAccess = false;

if (!hasAccess) {
  console.log('Доступ запрещен');
}

! и truthy/falsy значения

Оператор ! работает не только с true и false. Он может применяться к любым значениям.

let userName = '';

if (!userName) {
  console.log('Имя не указано');
}

Пустая строка - falsy значение. После ! она становится true, поэтому код внутри if выполнится.

let userName = 'Анна';

if (!userName) {
  console.log('Имя не указано');
}

В этом примере сообщение не появится, потому что непустая строка считается truthy.

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

Иногда можно встретить двойное отрицание !!. Оно превращает значение в настоящий boolean.

console.log(!!'JavaScript');
console.log(!!'');
console.log(!!0);
console.log(!!25);

Результат:

true
false
false
true

Первый ! переворачивает значение, второй ! переворачивает его обратно. В итоге получается true или false.

Для начинающих часто понятнее использовать Boolean():

console.log(Boolean('JavaScript'));
console.log(Boolean(''));

Скобки со сложными условиями

Если отрицание применяется к сложному условию, лучше использовать скобки.

let age = 16;
let hasPermission = false;

if (!(age >= 18 || hasPermission)) {
  console.log('Вход запрещен');
}

Сначала JavaScript проверяет условие в скобках: возраст подходит или есть разрешение. Потом ! меняет результат на противоположный.

Без скобок такой код читать сложнее, а смысл легко понять неправильно.

Итого

Оператор ! используется для отрицания. Он приводит значение к boolean и возвращает противоположный результат. В условиях ! удобно использовать для проверок вроде «не авторизован», «значение не указано», «доступа нет». Двойное отрицание !! превращает значение в true или false, но для учебного кода часто понятнее писать Boolean().