Истинные и ложные значения
Операторы &&, || и ! проверяют значение так, будто оно boolean. Это похоже на вопрос «есть там что-нибудь?», который задают коробке: пустая отвечает «нет», а коробка с вещами — «да». Для числа 0 ответ «ложь», а для строки "0" уже «истина»:
console.log(Boolean(0), Boolean("0")); // false true
console.log(Boolean(""), Boolean(" ")); // false true
console.log(Boolean(null), Boolean("false")); // false trueДавайте разберём программу по строкам:
- Число
0ложное, а строка"0"истинная: в ней есть символ. - Пустая строка ложная, а строка из одного пробела истинная.
nullложный, а строка"false"истинная, хотя в ней написано «ложь».
Функция Boolean(x) превращает значение в true или false по тем же правилам, что и логические операторы. Значения, которые она превращает в false, называют ложными, а остальные — истинными. Для строк важна только длина: пустая строка ложная, а любая другая истинная, даже строка из одного пробела или слово "false".
Восемь ложных значений
Все восемь ложных значений вы уже видели в уроке о логических операторах:
false;0,-0и0n;""— пустая строка;nullиundefined;NaN.
Минус ноль почти неотличим от обычного: сравнение -0 === 0 даёт true. Этот список стоит выучить: его часто просят назвать на собеседовании.
Всё остальное истинно
Любое значение, которого нет в списке, истинное. Это касается и пустого массива [] — списка значений, в котором нет ни одного элемента: он тоже истинный.
Здесь картинка с коробкой перестаёт работать. Массив [] пустой, как коробка без вещей, но на вопрос «есть там что-нибудь?» JavaScript отвечает «да». Для него важно, что сам массив существует, а не что в нём лежит.
NaN и запасное значение
Раз NaN ложное, результат неудачного приведения можно заменить запасным значением: Number("abc") || 0 даёт 0, потому что || пропускает ложное NaN. Оператор ?? так не сделает: он смотрит только на null и undefined, а NaN — ни то ни другое.
У такой замены есть изъян, знакомый по уроку о логических операторах. Number("0") || 7 даёт 7: настоящий ноль тоже ложный, и || заменил его вместе с NaN.
Двойное отрицание
Оператор ! превращает значение в boolean и переворачивает его. Два ! подряд переворачивают дважды, поэтому !!x даёт то же, что Boolean(x):
console.log(!!"Ann", !!42, !![]); // true true true
console.log(!!NaN, !!-0, !!0n); // false false false
console.log(!"", !!""); // true falseРазберём по строкам:
!!"Ann",!!42и!![]даютtrue: все три значения истинные.!!NaN,!!-0и!!0nдаютfalse: все три есть в списке ложных.!""даётtrue, а!!""даётfalse: первый!переворачивает ответ, второй возвращает его обратно.
Запись !!x короче, а Boolean(x) понятнее при чтении. Результат у них всегда одинаковый, и это всегда true или false, а не само значение x. Так из любого значения получают ответ «да или нет». Например, !!name говорит, есть ли в строке name хоть один символ.
Частая ошибка
Ответ «нет» хранят в строке и превращают его в boolean:
const answer = "false";
console.log(Boolean(answer)); // ✗Программа печатает true: строка "false" не пустая, а значит, истинная. Сравнивайте текст с текстом: answer === "true" даёт false.
Главное
- Ложных значений восемь:
false,0,-0,0n,"",null,undefinedиNaN. - Все остальные значения истинные, даже
"0","false"и пустой массив[]. Boolean(x)и!!xпревращают любое значение вtrueилиfalse.||заменяет запасным значением любое ложное значение, в том числе настоящий0.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.