Оператор ! (логічне НЕ)
Оператор ! називається логічним запереченням (NOT) і інвертує логічне значення виразу. Він спочатку приводить операнд до типу boolean, а потім перевертає результат, тому повертає завжди рівно true або false, незалежно від типу вхідного значення.
Теорія
TL;DR
!trueдаєfalse,!falseдаєtrue.- Якщо значення truthy (істинне), результат буде
false; якщо falsy (хибне), результат будеtrue. - Falsy значень лише вісім:
false,0,-0,0n,'',null,undefined,NaN. Усе інше truthy. []і{}це об'єкти, а отже truthy:![]і!{}даютьfalse.!!valueце ідіома явного приведення будь-якого значення доboolean.- Результат
!завжди має типboolean, тому оператор зручний у перевіркахif (!user).
Швидкий приклад
const isLoggedIn = false;
if (!isLoggedIn) {
// !false стає true, тому блок виконається
console.log('Користувач не авторизований');
}
const input = '';
console.log(!input); // true (порожній рядок falsy)
console.log(!!input); // false (те саме значення як boolean)Правило та поведінка з різними типами
Правило коротке:
!true // false
!false // trueЯкщо значення істинне (truthy), воно стане
false. Якщо значення хибне (falsy), воно станеtrue.
Повний набір прикладів для значень різних типів:
!true // false
!false // true
!0 // true (0 це хибне значення)
!1 // false (1 це істинне значення)
!"" // true (порожній рядок це хибне значення)
!"hello" // false (непорожній рядок це істинне значення)
!undefined // true
!null // true
!NaN // true
![] // false (масив це truthy)
!{} // false (об'єкт це truthy)Зверніть увагу на два останні рядки: порожній масив і порожній об'єкт не є falsy, бо це посилання на об'єкти. Перевіряти «порожнечу» треба явно, наприклад через arr.length === 0.
Подвійне заперечення !!
Дуже часто в JavaScript трапляється подвійний оператор:
!!valueВін використовується для приведення будь-якого значення до типу boolean: перше ! інвертує, друге повертає назад, і на виході залишається чистий логічний тип.
!!'hello' // true
!!'' // false
!!0 // false
!!123 // true
!!null // false
!!{} // true
!![] // true
!!це короткий і зрозумілий спосіб явно сказати: «Перетвори значення на булеве».
Той самий результат дає виклик Boolean(value), і в коді, який читають інші, він часто зрозуміліший. !! лишається популярним через стислість.
Використання в логічних виразах
! найчастіше зустрічається у перевірках умов:
const isLoggedIn = false;
if (!isLoggedIn) {
console.log('Користувач не авторизований');
}Тут
!isLoggedInдає!false, тобтоtrue, отже блокifвиконається.
Так само зручно перевіряти відсутність даних: if (!user), if (!items.length), if (!response.ok).
Як це працює всередині
- JavaScript спочатку приводить значення до логічного типу (
trueабоfalse). - Потім інвертує отриманий результат.
Приклад:
!'text' // крок 1: 'text' стає true; крок 2: !true стає falseСаме тому ! ніколи не повертає вихідне значення: на відміну від && і ||, які повертають один з операндів, ! завжди віддає новий boolean.
Порівняння з іншими логічними операторами
| Оператор | Назва | Приклад | Результат |
|---|---|---|---|
! | Логічне НЕ | !true | false |
&& | Логічне І | true && false | false |
|| | Логічне АБО | true || false | true |
Підсумкова таблиця за сценаріями використання:
| Ситуація | Що робить ! | Приклад |
|---|---|---|
| Заперечує логічне значення | Інвертує boolean | !true дає false |
Приводить значення до boolean | Подвійне !! | !!'js' дає true |
| Використовується в умовах | Перевірка відсутності | if (!user), тобто «якщо user не заданий» |
Типові помилки
- Вважати, що
![]або!{}даютьtrue. Масив і об'єкт це truthy, тому результатfalse; порожнечу перевіряйте черезlengthабоObject.keys(). - Плутати
!з&&і||: останні повертають один з операндів, а!завжди повертаєboolean. - Забувати, що
!'0'даєfalse: рядок'0'непорожній, а отже truthy, хоча число0є falsy. - Використовувати
!!там, де значення вже логічне; подвійне заперечення потрібне лише для приведення типу. - Писати
if (!x), коли треба відрізнити0або''відnull/undefined. Для цього кращеif (x == null)абоx ?? fallback. - Плутати логічне
!з!=та!==: це різні оператори, і пробіл чи знак рівності повністю змінюють зміст виразу.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.