Что такое…

Что такое boolean — и почему строка «false» на самом деле true

Иллюстрация: выключатель и две лампы — выключенная всё равно чуть светится из-за приклеенной записки

Вот задачка. Пользователь в настройках выключил уведомления. Сервер прислал "notifications": "false". Код проверяет if (notifications) — и… шлёт уведомление.

Никакой магии. Слово "false" в кавычках — это не ложь. Это строка из пяти букв. А любая непустая строка для JavaScript — правда. Давай разберёмся, как устроены «да» и «нет» в коде и где они врут.

Что такое boolean

Boolean (по-русски «булево значение», в честь математика Джорджа Буля) — самый простой тип данных. У него всего два варианта: true (правда) и false (ложь). Как выключатель: свет или горит, или нет. Третьего не дано.

const isLoggedIn = true
const hasPaid = false
const isAdult = age >= 18   // сравнение само выдаёт true или false

Булевы значения получаются из вопросов. «Возраст больше 18?» — true или false. «Пароли совпали?» — то же. Любое сравнение (>, <, ===) отвечает именно так.

Имена у таких переменных обычно начинаются с is, has, can: isOpen, hasError, canEdit. Увидишь такое в коде от ИИ — почти наверняка внутри true или false.

Зачем программе «да» и «нет»

Почти каждое решение в приложении — это развилка. Показать кнопку «Выйти» или «Войти»? Пустить на страницу оплаты? Подсветить поле красным? За каждым таким выбором стоит одна проверка, которая сводится к true или false.

if (isLoggedIn) {
  showProfile()
} else {
  showLoginButton()
}

Булевы значения умеют складываться в сложные условия:

  • && — «и»: isLoggedIn && hasPaid — правда, только если правда оба;
  • || — «или»: isAdmin || isOwner — хватит одного;
  • ! — «не»: !isLoading переворачивает значение.

Вот и весь набор. Из этих трёх деталек собирается логика любого экрана.

Правдивые и ложные: где JavaScript хитрит

А теперь то, чего не пишут в определениях. Внутри if JavaScript готов проверить что угодно, не только true и false. Он молча переводит любое значение в «да» или «нет».

Ложью (по-английски falsy) считается короткий список:

  • false
  • 0
  • "" — пустая строка
  • null и undefined
  • NaN

Всё остальное — правда (truthy). И вот тут начинаются сюрпризы:

Boolean("false")   // true — непустая строка
Boolean("0")       // true — тоже непустая строка
Boolean([])        // true — пустой массив!
Boolean({})        // true — пустой объект
Boolean(0)         // false

Каждая строчка — реальный баг из жизни:

  • "false" из сервера или localStorage. Там всё хранится строками. Сохранил false — достал "false", и оно истинно.
  • Пустой массив. if (items) пройдёт даже при []. Экран «ничего не найдено» не покажется. Правильно — if (items.length > 0).
  • Ноль. Цена 0 — бесплатный товар — внезапно считается «цены нет», и блок с ценой пропадает.

Как проверять правильно

Мысленная модель простая: спрашивай у кода ровно то, что имеешь в виду.

  • Хочешь знать, есть ли элементы — спрашивай длину: items.length > 0.
  • Хочешь знать, пришло ли значение, и ноль допустим — проверяй пустоту явно: price !== null && price !== undefined или price != null.
  • Флаг пришёл строкой — сравни со строкой: value === "true". Или лучше попроси сервер присылать настоящий true.

А в промпте для ИИ помогает одна фраза: «флаги храни как boolean, а не строки; ноль — это допустимое значение». Модель перестанет писать ленивое if (price).

Если используешь TypeScript, он поймает часть таких историй ещё до запуска. Подробнее — в сравнении TypeScript и JavaScript.

Когда ты встретишь boolean

Буквально везде, где есть «вкл/выкл»:

  • галочки и переключатели в формах — их значение true или false;
  • состояние экрана: isLoading, isOpen, hasError;
  • права доступа: isAdmin, canEdit;
  • колонки в базе данных вроде is_paid или is_deleted.

Чем == отличается от === при проверке на true?

Двойное равно пытается привести типы и путается: [] == false даёт true. Тройное сравнивает честно, без превращений. Пиши === почти всегда.

Что такое «!!» в коде?

Двойное отрицание превращает любое значение в честный boolean. !!"текст" даёт true, !!0 даёт false. Это короткая запись Boolean(значение).

В Python так же?

Похоже, но пустой список там — ложь. if []: в Python не выполнится, а в JavaScript выполнится. Переносишь код между языками — проверь такие места первыми.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →