JavaScript 中的布尔值转换规则其实并不复杂——它遵循一套明确的真值与假值判断标准。所有值要么被隐式、要么被显式地转换为 true 或 false,关键在于记住那个短名单:哪些是假值?其余一律为真值。

只有 6 个假值(falsy)
在 JavaScript 中,以下 6 个值在布尔上下文中会被自动判定为 false,而且只有这 6 个,多一个都不算:
false(布尔值本身)0(数字零,包括-0和+0)''(空字符串,注意:' '(含空格)是真值)nullundefinedNaN
其他所有值——包括 0n(BigInt 零)、{}(空对象)、[](空数组)、new Date('invalid')(无效日期)、function(){}(空函数)——统统是真值。没错,这些直觉上“空”的东西,在布尔判断中全是真值。
显式转换用 Boolean() 最可靠
想知道一个值到底是真是假,最直接的方法就是调用 Boolean(value):
Boolean([])→true(空数组不是假值)Boolean({})→true(空对象也不是假值)Boolean(new Boolean(false))→true(包装对象始终是真值)
有人喜欢用双重否定 !!value 来写逻辑判断,虽然结果等价,但可读性实在一言难尽。相比之下,Boolean() 语义清晰多了,调试和类型断言时用起来也更顺手。
隐式转换发生在条件判断和逻辑运算中
在实际编码中,隐式转换才是最常遇到的情况——if、while、三元运算符、&&、||、?? 都会触发强制转换:
if ([]) { ... }→ 会执行(因为[]是真值)0 || 'default'→'default'(0是假值,所以返回右侧)'' ?? 'fallback'→'fallback'(??只在null或undefined时生效,空字符串不触发)
这里需要特别留个心:?? 和 || 行为可不一样。前者只对 null/undefined 敏感,后者则是所有假值都管。搞混了,逻辑就容易走偏。
对象和函数永远是真值,哪怕内容为空
这点常常让新手栽跟头:JavaScript 不会去检查对象属性是否为空、函数体是否为空,它只看类型——只要它是对象或函数,就直接判定为真值:
Boolean({})、Boolean([])、Boolean(() => {})全是trueBoolean(new Number(0))→true(包装对象是对象类型,不受原始值假值规则约束)- 如果你真想判断一个对象是否“空”,得手动检查:
Object.keys(obj).length > 0或者用for...in遍历一下
千万别把 if (obj) 当成“对象是否有内容”的判断——它只能告诉你 obj 不是 null 或 undefined,至于里面装了多少东西,它才不管。这才是关键所在。
