У каждого значения есть своё «булево настроение»
В JavaScript на месте булева значения можно подставить любое значение — внутри if, в условии while, рядом с && или ||. В этот момент значение приводится к true или false. Те, что превращаются в false, называют falsy (ложными), все остальные — truthy (истинными).
Никакой функции-конвертера, никакого явного каста — JavaScript делает всё сам. Правила зафиксированы и их немного, так что достаточно запомнить список falsy-значений — и всё остальное встаёт на свои места.
Полный список falsy-значений в JavaScript
Ровно семь значений считаются falsy. Всё остальное в языке — truthy.
Вот и весь список:
false— собственно сам булевfalse.0и-0— оба нуля.0n— BigInt-ноль.""— пустая строка (одинарные, двойные, обратные кавычки — без разницы).null— значение «намеренно ничего».undefined— значение «не задано».NaN— результат некорректной математики вроде0 / 0.
Запомните эти семь. И дальше, когда сомневаетесь насчёт любого значения, просто спрашивайте себя: «оно входит в эти семь?» Если нет — значит, truthy.
Подводные камни: "0", [] и {}
Вот тут новички чаще всего обжигаются. Куча значений выглядят пустыми, но на самом деле truthy:
Строка считается falsy только если в ней ноль символов. У "0" один символ — значит, это truthy. А вот массивы и объекты в JavaScript всегда truthy, даже пустые: движок воспринимает их как объекты, а любой объект — truthy, что бы в нём ни лежало (или не лежало).
Если ты пришёл из Python — это, пожалуй, самый непривычный момент. Там [] и {} — falsy. В JavaScript — нет.
Как правильно проверять массив или объект на пустоту
Раз [] и {} — это truthy, напрямую запихнуть их в if для проверки на пустоту не получится. Пиши явно:
То же самое со строками — если вы хотите считать строку из одних пробелов пустой:
Truthy и falsy — это удобная сокращённая запись, а не замена размышлениям о том, что именно «пусто» для ваших данных.
Приведение к boolean в JavaScript
Иногда нужно получить настоящее true или false, а не просто «truthy-подобное» значение. Для этого есть два приёма:
Boolean(x) — это явное приведение к boolean. !!x делает ровно то же самое, только короче: первый ! превращает значение в булево и инвертирует его, а второй ! возвращает исходный смысл. Оба варианта встречаются повсеместно. !! лаконичнее, а Boolean() читается понятнее.
Двойное отрицание !! часто попадается в return, когда функция должна вернуть честный boolean:
Truthy/Falsy в связке с && и ||
Логические операторы в JavaScript не возвращают true или false — они возвращают один из операндов. А какой именно — зависит от его «правдивости» (truthy/falsy):
Именно поэтому шаблон value || defaultValue так часто встречается для значений по умолчанию. Но тут есть ловушка: он одинаково относится ко всем falsy-значениям, включая 0 и "", а это зачастую вполне валидные входные данные:
Если нужно подставить значение по умолчанию только для null или undefined, берите оператор нулевого слияния ??. Про него есть отдельная статья.
Краткая шпаргалка
Распечатай, приклей к монитору и живи дальше.
Дальше: итераторы и генераторы
Условные конструкции и циклы уже в кармане — значит, пора разобраться, как в JavaScript значения умеют «выдаваться» по запросу. Итераторы и генераторы — это как раз та механика, которая стоит за for...of, оператором spread и кучей современных API. Про них и поговорим в следующей главе.
Часто задаваемые вопросы
Какие значения в JavaScript считаются falsy?
Их ровно семь: false, 0, -0, 0n (BigInt-ноль), '' (пустая строка), null, undefined и NaN. Всё остальное — truthy, включая '0', 'false', [] и {}. Запомните этот короткий список — и для любого другого значения ответ получите методом исключения.
Пустой массив в JavaScript — это truthy или falsy?
Truthy. Конструкция if ([]) { ... } спокойно войдёт в блок, и это частенько сбивает с толку тех, кто пришёл из Python или PHP. Массивы и объекты — это объекты, а любые объекты считаются truthy независимо от содержимого. Чтобы проверить, что массив пуст, пишите явно: arr.length === 0.
Как привести значение к boolean в JavaScript?
Есть два способа: Boolean(value) — явный вариант, и !!value — короткая запись (двойное отрицание: сначала приводит и инвертирует, потом инвертирует обратно). Оба работают по одним и тем же правилам truthy/falsy. Используйте их, когда нужен именно true или false, а не просто «что-то истинное».