Что такое truthy и falsy значения в JavaScript?

Ответ

В JavaScript (и, соответственно, в Node.js) truthy и falsy — это термины, описывающие значения, которые при неявном приведении к булевому типу (например, в условии if) становятся true или false.

Список falsy-значений (всего 8):

  1. false
  2. 0 (ноль)
  3. -0 (минус ноль)
  4. 0n (BigInt ноль)
  5. "", '', `` (пустая строка)
  6. null
  7. undefined
  8. NaN

Любое другое значение является truthy. Это включает в себя:

  • "0", "false", " " (непустая строка, даже если содержит только пробел)
  • [] (пустой массив)
  • {} (пустой объект)
  • function() {} (пустая функция)
  • Infinity

Практические примеры в Node.js:

// Проверка на truthy/falsy
const userInput = process.argv[2]; // Аргумент командной строки

if (userInput) { // Если аргумент передан (не undefined и не пустая строка)
  console.log(`Вы ввели: ${userInput}`);
} else {
  console.log('Аргумент не предоставлен.');
}

// Логический оператор ИЛИ (||) использует это поведение для задания значений по умолчанию
const port = process.env.PORT || 3000; // Если PORT не задан (undefined) или равен 0, будет использовано 3000
console.log(`Сервер запущен на порту ${port}`);

// Опциональная цепочка (?.) и оператор объединения с null (??) работают иначе:
// `??` реагирует только на `null` и `undefined`.
const configValue = someObject?.nested?.value ?? 'default'; // 'default' только если value === null/undefined

Ответ 18+ 🔞

А, ну это тема, которая вроде как простая, а потом бац — и ты уже сидишь и думаешь, какого хуя твой код не работает. Ёпта, давай разжую.

Вот смотри, в JavaScript, а значит и в Node.js, есть такая штука — truthy и falsy. Это не какие-то там сложные термины, а просто обозначение для значений, которые, когда ты их суёшь в условие if, превращаются либо в true, либо в false. Сам от себя охуеешь, насколько это просто.

Вот список всех фальшивых (falsy) значений. Их, блядь, всего восемь, запомнить проще, чем пароль от почты:

  1. false (ну, это очевидно)
  2. 0 (просто ноль)
  3. -0 (минус ноль, да, и такое бывает, ядрёна вошь)
  4. 0n (это BigInt ноль, для особо точных расчётов)
  5. "", '', `` (пустая строка, хоть одинарные, хоть двойные кавычки, хоть шаблонные)
  6. null (классика)
  7. undefined (тоже классика)
  8. NaN (Not-a-Number, результат какой-нибудь ерунды вроде 0 / "hello")

Всё остальное — это truthy, то есть считается за true. Даже то, что выглядит как обманка:

  • "0", "false", " " (строка с пробелом — уже не пустая, хитрая жопа).
  • [] (пустой массив — да, truthy! Удивление пиздец, но это факт).
  • {} (пустой объект — тоже truthy).
  • function() {} (пустая функция).
  • Infinity (бесконечность, куда уж больше).

А теперь смотри, как это в жизни выглядит в Node.js:

// Самый частый случай — проверка, пришло ли что-то от пользователя
const userInput = process.argv[2]; // Берём второй аргумент из командной строки

if (userInput) { // Вот тут магия! Если аргумент не пустая строка и не undefined...
  console.log(`Вы ввели: ${userInput}`);
} else {
  console.log('Аргумент не предоставлен.'); // ...а если falsy, то вот это.
}

// Или вот старый добрый трюк с ИЛИ (||) для значения по умолчанию
const port = process.env.PORT || 3000; // Если переменная окружения PORT — falsy (undefined или 0), то берём 3000
console.log(`Сервер запущен на порту ${port}`);

// Но осторожно! Оператор `||` реагирует на ЛЮБОЕ falsy. Поэтому появился `??`.
// `??` (объединение с null) — он по-честному, только на `null` и `undefined` срабатывает.
const configValue = someObject?.nested?.value ?? 'default'; // 'default' подставится ТОЛЬКО если value === null или undefined

Вот и вся наука. Главное — не перепутать, когда тебе нужна строгая проверка на null/undefined, а когда сойдёт и общая на falsy. А то будет тебе хиросима в коде, чувак.