Ответ
В JavaScript (и, соответственно, в Node.js) truthy и falsy — это термины, описывающие значения, которые при неявном приведении к булевому типу (например, в условии if) становятся true или false.
Список falsy-значений (всего 8):
false0(ноль)-0(минус ноль)0n(BigInt ноль)"",'',``(пустая строка)nullundefinedNaN
Любое другое значение является 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) значений. Их, блядь, всего восемь, запомнить проще, чем пароль от почты:
false(ну, это очевидно)0(просто ноль)-0(минус ноль, да, и такое бывает, ядрёна вошь)0n(это BigInt ноль, для особо точных расчётов)"",'',``(пустая строка, хоть одинарные, хоть двойные кавычки, хоть шаблонные)null(классика)undefined(тоже классика)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. А то будет тебе хиросима в коде, чувак.