У каждого значения есть своё «булево настроение»
В 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, а не просто «что-то истинное».