JavaScript中仅有6个假值:false、0、-0、0n、""、null、undefined、NaN;其余均为真值;&&和||返回操作数本身而非布尔值;!是唯一总返回布尔值的运算符;避免用==或!=比较布尔值。

布尔值运算看似简单,但真正出问题的地方,往往藏在“自动判断真假”这个环节里。它不看你是不是写了 true 或 false,而是看值本身的“真值性(truthy)”或“假值性(falsy)”。不同语言规则不同,但核心陷阱高度相似。
JavaScript 中那 6 个“假值”是唯一确定的底线
JS 只有且仅有以下 6 个值在布尔上下文中被当作 false 处理:
- false(布尔字面量)
- 0、-0、0n(数字零及 BigInt 零)
-
""(空字符串,注意:
" "或"0"都不是) - null
- undefined
- NaN
其余所有值——包括 []、{}、new Date()、/regex/、"false"、"0"、42、Infinity——全是 truthy。记不住全部?只记住这 6 个,其他默认为真,更可靠。
逻辑运算符返回的是值,不是布尔结果
&& 和 || 不会把结果变成 true 或 false,它们只是按真假规则“选一个原始值”返回:
-
a || b:如果a是 falsy,返回b;否则返回a(常用于默认值:config.timeout || 5000) -
a && b:如果a是 falsy,返回a;否则返回b(常用于安全取值:user && user.profile && user.profile.name) -
!是唯一总返回布尔值的运算符:![]→false,!![]→true
误以为 || 返回布尔值,就可能写出 if (arr || []) { ... } 这类逻辑混乱的代码——其实它永远进 if,因为 [] 是 truthy。
别拿 == 或 != 去比布尔值
用 value == true 或 value != false 是高危操作。比如:
-
[1].match(/\d/) != true→true(因为数组先转字符串再转数字,最终变成NaN != 1) -
"0" == false→true(字符串"0"转数字为0,再与false(→0)比较)
正确做法是:
- 检查是否存在?直接
if (value)或if (value != null) - 确认就是布尔类型?用严格相等:
value === true - 需要显式布尔结果?用
Boolean(value)或!!value
C/C++/C++ 和 Python 的隐式转换逻辑更“数学化”
这些语言中,布尔转换更接近数值逻辑:
- C/C++/C++:任何非零数、非空指针 →
true;零、nullptr、0.0→false;反过来,true总是1,false总是0 - Python:
bool是int的子类,True == 1、False == 0恒成立;空容器([]、{}、"")为False,其余多为True(但注意:0.0、0j也是False)
这类转换虽规则清晰,但容易掩盖语义——比如把计数器 int retry = 3 直接放进 if (retry),虽然能运行,却丢失了“这是次数”还是“这是开关”的意图。

















