Boolean (bool, логический или булев тип) — тип данных с двумя значениями: true (истина) и false (ложь). Его возвращает любое сравнение вроде age >= 18, и по нему программа решает, выполнить ли ветку if или повторить цикл ещё раз.
Название тип получил по имени математика Джорджа Буля, автора алгебры логики. Ниже разберём, как boolean записывается в Python, JavaScript, Java, C и SQL, какие с ним бывают операции и какие ошибки с ним встречаются чаще всего. Общую картину о том, как языки относятся к типам, даёт статья о типизации в программировании.
Что такое boolean и откуда берутся true и false

Переменная типа boolean хранит ответ «да» или «нет». Чаще всего вы не пишете true руками, а получаете его из сравнения:
age = 20
is_adult = age >= 18
print(is_adult, type(is_adult))
True <class 'bool'>
Идея во всех языках одна, а запись разная. Регистр букв важен: в Python значения пишутся с заглавной, в JavaScript и Java строчными.
| Язык | Тип | Значения | Что важно знать |
|---|---|---|---|
| Python | bool |
True, False |
bool наследуется от int, True + True даёт 2 |
| JavaScript | boolean |
true, false |
в условии любое значение приводится к логическому |
| Java | boolean |
true, false |
число в boolean не приводится даже явно |
| C# | bool |
true, false |
значение по умолчанию false, для трёх состояний есть bool? |
| C | bool (до C23 _Bool) |
true, false |
0 считается ложью, любое другое число истиной |
| SQL (PostgreSQL) | boolean |
TRUE, FALSE, NULL |
третье состояние «неизвестно» |
Правила для каждого языка описаны в документации: Python, спецификация Java, справочник C#, cppreference для C и PostgreSQL. Java и JavaScript похожи только названием, и логический тип у них ведёт себя по-разному. Чем ещё отличаются эти языки, разобрано в материале про Java и JavaScript.
Логические операции И, ИЛИ, НЕ

Булевы значения комбинируют тремя базовыми операциями. В Python это слова and, or, not, в JavaScript, Java, C и C# символы &&, ||, !.
- И (and, &&) даёт true, только если истинны оба операнда.
- ИЛИ (or, ||) даёт true, если истинен хотя бы один.
- НЕ (not, !) переворачивает значение.
Все варианты умещаются в таблицу истинности:
| A | B | A и B | A или B | не A |
|---|---|---|---|---|
| true | true | true | true | false |
| true | false | false | true | false |
| false | true | false | true | true |
| false | false | false | false | true |
Порядок вычисления такой: сначала НЕ, потом И, потом ИЛИ. Поэтому выражение True or True and False в Python вернёт True: часть с and посчитается первой.
print(True and False, True or False, not True)
print(True or True and False)
print(not 1 == 2)
False True False
True
True
Третий результат новички обычно не ожидают. Документация Python объясняет: у not приоритет ниже, чем у операторов сравнения, и not a == b читается как not (a == b). Полный список приоритетов и знаков есть в разборе операторов Python.
Короткое замыкание: когда вторую часть не проверяют
Если по первому операнду ответ уже ясен, второй не вычисляется. В False and x результат будет false при любом x, а в True or x всегда true.
def check():
print("вызов check()")
return True
print(False and check())
print(True or check())
False
True
Строка «вызов check()» не напечаталась ни разу: функция не запускалась. На этом построен частый приём защиты от ошибок: if user and user.is_admin не упадёт, когда user пуст, потому что до второй проверки дело не дойдёт.
В JavaScript правило то же. На нём построены проверки вида el && el.remove(): элемент страницы удаляют, только если он нашёлся. Как искать элементы и что вернёт пустой поиск, показано в статье о DOM-дереве в JavaScript.
Тяжёлую или опасную проверку ставьте второй. Лёгкая и отсекающая пусть стоит первой.
Какие значения считаются ложными
В условие можно передать не только true или false. Python и JavaScript сами приводят число, строку или список к логическому значению, и списки «ложных» значений у них совпадают не полностью.
print(bool(0), bool(""), bool([]), bool("0"), bool("False"), bool([0]))
False False False True True True
console.log(Boolean(0), Boolean(""), Boolean([]), Boolean("0"), Boolean("false"), Boolean(NaN), Boolean(null), Boolean(undefined));
false false true true true false false false| Значение | Python | JavaScript |
|---|---|---|
| 0, 0.0 | ложь | ложь |
| пустая строка | ложь | ложь |
пустой список [] |
ложь | истина |
пустой словарь или объект {} |
ложь | истина |
строка "0" или "false" |
истина | истина |
| None / null, undefined | ложь | ложь |
| NaN | истина | ложь |
Перечни взяты из раздела Truth Value Testing и глоссария MDN. В таблице MDN для JavaScript их девять: кроме перечисленных, туда входят -0, 0n и редкий document.all.
Разница в пустом списке и NaN часто ломает код у тех, кто переходит с Python на JavaScript или обратно. Если вы только выбираете первый язык, загляните в разбор о том, зачем новичку JavaScript.
В Java так не получится. По спецификации языка условие if должно иметь тип boolean или Boolean, иначе код не скомпилируется. Число превращают в логическое значение сравнением x != 0, этот способ приводит раздел о типе boolean.
Boolean и числа
До стандарта C99 отдельного логического типа в C не было: условие проверяло число, и всё, кроме нуля, считалось истиной. В C99 появился _Bool, в C23 bool, true и false стали ключевыми словами. Внутри это по-прежнему 1 и 0.
#include <stdio.h>
#include <stdbool.h>
int main(void) {
bool ready = false;
int a = 3, b = 7;
printf("%d %d %d\n", ready, true, a && b);
return 0;
}
0 1 1
В Python похожее устройство: bool там подкласс int.
print(True + True, True == 1, isinstance(True, int))
2 True True
Посчитать, сколько элементов прошли проверку, можно через sum(x > 0 for x in data). Но документация не рекомендует полагаться на то, что True ведёт себя как 1, и советует явно вызывать int(). Код с явным преобразованием проще читать. Потренироваться на таких выражениях можно в 30 задачах по Python для начинающих, а системно язык разбирают на курсах по Python.
Логическое значение часто служит условием цикла: while running: повторяет тело, пока флаг не станет false. Как не попасть в бесконечный цикл, показано в статье о цикле while в Python.
Частые ошибки с boolean

Строка «false» оказывается истиной
Значение из конфига, формы или переменной окружения приходит строкой. bool("False") в Python и Boolean("false") в JavaScript возвращают true, потому что строка непустая.
Решение: сравнивайте текст явно, например value.lower() in ("true", "1", "yes").
and и or возвращают не true и false
В Python и JavaScript эти операторы отдают один из операндов, а не логическое значение. Для Python это прямо сказано в документации.
print("" or "гость", 0 and 10, [] or None)
гость 0 None
Приём удобен для значений по умолчанию, но подводит, когда 0 или пустая строка допустимы. В JavaScript для этого есть ??: 0 ?? 5 вернёт 0, а 0 || 5 вернёт 5.
Объект new Boolean(false) истинный
В JavaScript new Boolean(false) создаёт объект, а любой объект в условии считается истиной.
const flag = new Boolean(false);
if (flag) console.log("сработало", typeof flag);
сработало object
Решение: вызывайте Boolean(x) без new или пишите !!x. Конструктор для преобразования не советует использовать и MDN.
Присваивание вместо сравнения
В C запись if (x = 0) не сравнивает, а кладёт в x ноль, и условие всегда ложно. Компилятор clang 17 предупреждает об этом даже без дополнительных флагов и подсказывает заменить = на ==. Такие предупреждения не стоит пролистывать.
Лишнее сравнение с True
Конструкции if is_ready == True или if (isReady === true) работают, но читаются тяжелее, чем if is_ready. Если условие нужно записать в одну строку, пригодится тернарный оператор.
Логический тип в SQL: третье значение NULL
В базах данных boolean бывает не двух, а трёх состояний. Документация PostgreSQL называет их true, false и «unknown», а «неизвестно» хранится как NULL. Из-за этого условие = FALSE теряет строки с пустым флагом.
CREATE TABLE users(name TEXT, is_active BOOLEAN);
INSERT INTO users VALUES ('Аня', TRUE), ('Борис', FALSE), ('Вера', NULL);
SELECT name FROM users WHERE is_active = FALSE;
SELECT name FROM users WHERE is_active IS NOT TRUE;
Борис
Борис
Вера
Пример выполнится и в SQLite, и в PostgreSQL: сравнение с NULL там устроено одинаково. Первый запрос не видит Веру: сравнение NULL с FALSE даёт не «ложь», а NULL. IS NOT TRUE забирает и false, и пустые значения. Подробнее о том, как NULL ведёт себя в выборках, написано в статье про NULL в SQL.
Где освоить программирование системно
С boolean можно разобраться за вечер, а дальше идут условия, циклы, функции и структуры данных. Удобнее проходить их по программе, где после каждой темы есть задачи с проверкой. План первых шагов есть в материале о программировании с нуля.
Курсы удобно сравнивать в каталоге: в разделе курсов по JavaScript видны цена, длительность и отзывы учеников.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| JavaScript Перейти на сайт курса | 63 829 ₽ | 4086 ₽/мес. | 3 месяца | Обзор курса | |
| Fullstack разработчик JavaScript Перейти на сайт курса | 75 000 ₽ | 20 000 ₽/мес. | 6 месяцев | Обзор курса | |
| Факультет fullstack JavaScript Перейти на сайт курса | 134 700 ₽ | 3742 ₽/мес. | 15 месяцев | Обзор курса | |
| Fullstack-разработчик на JavaScript Перейти на сайт курса | 158 760 ₽ | 6615 ₽/мес. | 11 месяцев | Обзор курса | |
| Фулстек-разработчик на JavaScript Перейти на сайт курса | 153 348 ₽ | 4296 ₽/мес. | 11 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Javascript




