Перейти к содержимому
Теория · Операторы и приведение типов · урок 8 из 14

Истинные и ложные значения

Операторы &&, || и ! проверяют значение так, будто оно boolean. Это похоже на вопрос «есть там что-нибудь?», который задают коробке: пустая отвечает «нет», а коробка с вещами — «да». Для числа 0 ответ «ложь», а для строки "0" уже «истина»:

JavaScript
console.log(Boolean(0), Boolean("0")); // false true
console.log(Boolean(""), Boolean(" ")); // false true
console.log(Boolean(null), Boolean("false")); // false true

Давайте разберём программу по строкам:

  1. Число 0 ложное, а строка "0" истинная: в ней есть символ.
  2. Пустая строка ложная, а строка из одного пробела истинная.
  3. 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):

JavaScript
console.log(!!"Ann", !!42, !![]); // true true true
console.log(!!NaN, !!-0, !!0n); // false false false
console.log(!"", !!""); // true false

Разберём по строкам:

  1. !!"Ann", !!42 и !![] дают true: все три значения истинные.
  2. !!NaN, !!-0 и !!0n дают false: все три есть в списке ложных.
  3. !"" даёт true, а !!"" даёт false: первый ! переворачивает ответ, второй возвращает его обратно.

Запись !!x короче, а Boolean(x) понятнее при чтении. Результат у них всегда одинаковый, и это всегда true или false, а не само значение x. Так из любого значения получают ответ «да или нет». Например, !!name говорит, есть ли в строке name хоть один символ.

Частая ошибка

Ответ «нет» хранят в строке и превращают его в boolean:

JavaScript
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 и подпишись на канал — откроются все уроки.

Войти другим способом