JavaScript - 真值/假值
真值与假值
在 JavaScript 中,真值和假值与布尔值求值相关。JavaScript 中的每个值都具有固有的布尔"真"或"假",这意味着它可以在布尔上下文(例如条件表达式和逻辑运算符)中被确定为真或假。
- 真值:当一个值转换为布尔值时,它返回真。真值包括非空字符串、非零数字、数组、对象和函数。
- 假值:这些值被定义为不为真的值。例如,0、null、undefined、NaN、false(布尔值)和空字符串 ("")。
示例
让我们使用一个场景和一个简单的 JavaScript 方法来检查用户是否拥有有效订阅。我们假设只有新用户才拥有 subscriptionDays 字段。老用户无法使用此字段,但新用户可以将其设置为 0,以指示其订阅已过期。
代码如下 -
// 没有 subscriptionDays 的老用户
const userOld = {
name: "Alisha",
email: "alisha@example.com"
};
// 拥有有效订阅的新用户
const userNewWithSubscription = {
name: "Shital",
email: "shital@example.com",
subscriptionDays: 30
};
// 订阅已过期的新用户
const userNewWithoutSubscription = {
name: "Chetan",
email: "chetan@example.com",
subscriptionDays: 0
};
function displaySubscriptionStatus(user) {
// 明确检查 subscriptionDays 是否未定义
if (user.subscriptionDays !== undefined) {
if (user.subscriptionDays > 0) {
console.log(`User has ${user.subscriptionDays} days of subscription left.`);
} else {
console.log("User's subscription has expired.");
}
} else {
console.log("User does not have a subscription.");
}
}
displaySubscriptionStatus(userOld);
displaySubscriptionStatus(userNewWithSubscription);
displaySubscriptionStatus(userNewWithoutSubscription);
输出
这将生成以下结果 -
User does not have a subscription. User has 30 days of subscription left. User's subscription has expired.
JavaScript 中的真值与假值
除了类型之外,每个值都有一个底层布尔值,通常被归类为真或假。一些定义非布尔值如何转换为真或假的规则并不常见。了解这些原则及其对比较的影响在调试 JavaScript 应用程序时很有帮助。
以下是始终为假的值 -
false
0(零)
-0(负零)
0n(BigInt 零)
'', "", ``(空字符串)
null
undefined
NaN
其他所有值均为真。其中包括 -
'0'(包含单个零的字符串)
'false'(包含文本 false 的字符串)
[](空数组)
{}(空对象)
function(){}(空函数)
因此,条件中只能使用一个值。例如 -
if (value) {
// value 为真
}
else {
// 值为 false
// 可以是 false、0、''、null、undefined 或 NaN
}
处理真值或假值
即使对于经验丰富的程序员来说,判断代码中的真假也并非易事。对于初学者和从其他编程语言转行过来的人来说,这将是一项巨大的挑战!但只需遵循三个简单的步骤,你就能找出处理真值和假值时最棘手的错误。我们将在下一节中分别讨论每个步骤 -
避免直接比较
很少需要比较两个真值和假值,因为其中一个值始终等于 true 或 false -
// 而不是 if (a == false) // 如果 x 为 false、0、'' 或 [] 则运行 // 使用以下代码 if (!x) // ... // 如果 x 为 false、0、''、NaN、null 或 undefined 则运行
使用 === 严格相等
比较值时,可以使用 === 严格相等(或 !== 严格不等)比较来避免类型转换问题 -
// 而不是 if (a == b) // 如果 x 和 y 都为真或都为假,则运行 // 例如 x = null 且 y = undefined // 使用 if (a === b) // 如果 x 和 y 相同,则运行…… // 除非两者都为 NaN
转换为实际布尔值
在 JavaScript 中,您可以使用双重否定!!或布尔构造函数将任何值转换为实际布尔值。这样您就可以确定只有 false、0、""、null、undefined 和 NaN 会产生 false -
// 而不是 if (x === y) // 如果 x 和 y 相同,则执行此操作…… // 除非两者都为 NaN // 使用 if (Boolean(x) === Boolean(y)) // 或 if (!!x === !!y) // 如果 x 和 y 相同,则执行此操作…… // 包括其中一个或两个为 NaN 的情况
当布尔构造函数传入真值时,返回 true;传入假值时,返回 false。与迭代方法配合使用时,这会很有帮助。例如 -
const truthy_values = [false,0,``,'',"",null,undefined,NaN,'0','false',[],{},function() {}].filter(Boolean);
// 过滤掉假值并记录剩余的真值
console.log(truthy_values);
总结
真值和假值允许您编写三元运算符和简单的 JavaScript 条件。但切勿忘记一些特殊情况。一个空数组或 NaN 变量就可能导致数小时的故障排除!

