主题
假值
假值指的是在布尔上下文中会被当作 false 的值。理解假值的意义,不只是为了背列表,而是为了避免在条件判断、默认值处理和短路表达式里写出误判代码。
什么是假值
JavaScript 在 if、while、逻辑运算等场景里,往往会把一个值自动转换成布尔值。
js
if (value) {
console.log('truthy')
}如果这个值在转换后是 false,它就是假值。
JavaScript 中的假值有哪些
常见假值如下:
| 值 | 类型 | 说明 |
|---|---|---|
false | Boolean | 布尔假 |
0 | Number | 数字零 |
-0 | Number | 负零 |
0n | BigInt | BigInt 零 |
'' | String | 空字符串 |
null | Null | 空值 |
undefined | Undefined | 未定义 |
NaN | Number | 非数字 |
浏览器环境里还有一个历史遗留例外:
| 值 | 类型 | 说明 |
|---|---|---|
document.all | Object | 历史兼容对象,布尔上下文中表现为假值 |
和真值的关系
除了上面这些,绝大多数值都是真值,例如:
js
Boolean('0') // true
Boolean([]) // true
Boolean({}) // true
Boolean('false') // true这也是 JavaScript 初学阶段最容易误判的地方。
常见误区
字符串 '0' 不是假值
js
if ('0') {
console.log('run')
}它会执行,因为 '0' 是非空字符串,属于真值。
空数组和空对象也不是假值
js
Boolean([]) // true
Boolean({}) // true很多语言里“空集合”可能更接近假值语义,但 JavaScript 不是这样。
'false' 也是真值
js
Boolean('false') // true因为它本质上仍然只是一个非空字符串。
假值最常在哪些地方造成问题
条件判断
js
if (count) {
console.log('has count')
}如果 count = 0 在业务上是合法值,这里就会误判。
默认值处理
js
const pageSize = input || 10如果 input = 0,这里会得到 10,这未必符合预期。
更稳妥的写法通常是:
js
const pageSize = input ?? 10因为 ?? 只会在 null 或 undefined 时才走默认值。
表单和接口数据
例如接口返回:
js
{
enabled: false,
count: 0,
text: ''
}这三个值都可能是合法业务值,但如果只写:
js
if (!value) {
// ...
}就会把很多“有意义但刚好是假值”的结果一起吞掉。
如何判断“值不存在”而不是“值为假”
如果想判断变量是否真的缺失,通常更适合明确写出:
js
if (value === null || value === undefined) {
console.log('missing')
}或者:
js
if (value == null) {
console.log('missing')
}其中 value == null 是一个少数相对可控的宽松比较写法,它能同时匹配:
nullundefined
和逻辑运算符的关系
假值会直接影响这些运算符的结果:
if (value)value || fallbackvalue && next!value
例如:
js
console.log(0 || 100) // 100
console.log('' || 'fallback') // fallback
console.log(false && 'next') // false所以只要代码里出现 || 提供默认值、&& 做短路分支,就要立刻意识到“这里会受假值规则影响”。
使用建议
- 先分清是在判断“真假”,还是在判断“值是否存在”。
- 当
0、false、空字符串属于合法业务值时,不要直接用if (value)或value || fallback。 - 给默认值时,优先想清楚应该用
||还是??。 - 看到判断结果和直觉不符时,优先排查是不是假值转换导致的。
