Skip to content

假值

假值指的是在布尔上下文中会被当作 false 的值。理解假值的意义,不只是为了背列表,而是为了避免在条件判断、默认值处理和短路表达式里写出误判代码。

什么是假值

JavaScript 在 ifwhile、逻辑运算等场景里,往往会把一个值自动转换成布尔值。

js
if (value) {
  console.log('truthy')
}

如果这个值在转换后是 false,它就是假值。

JavaScript 中的假值有哪些

常见假值如下:

类型说明
falseBoolean布尔假
0Number数字零
-0Number负零
0nBigIntBigInt 零
''String空字符串
nullNull空值
undefinedUndefined未定义
NaNNumber非数字

浏览器环境里还有一个历史遗留例外:

类型说明
document.allObject历史兼容对象,布尔上下文中表现为假值

和真值的关系

除了上面这些,绝大多数值都是真值,例如:

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

因为 ?? 只会在 nullundefined 时才走默认值。

表单和接口数据

例如接口返回:

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 是一个少数相对可控的宽松比较写法,它能同时匹配:

  • null
  • undefined

和逻辑运算符的关系

假值会直接影响这些运算符的结果:

  • if (value)
  • value || fallback
  • value && next
  • !value

例如:

js
console.log(0 || 100) // 100
console.log('' || 'fallback') // fallback
console.log(false && 'next') // false

所以只要代码里出现 || 提供默认值、&& 做短路分支,就要立刻意识到“这里会受假值规则影响”。

使用建议

  • 先分清是在判断“真假”,还是在判断“值是否存在”。
  • 0false、空字符串属于合法业务值时,不要直接用 if (value)value || fallback
  • 给默认值时,优先想清楚应该用 || 还是 ??
  • 看到判断结果和直觉不符时,优先排查是不是假值转换导致的。

基于 MIT 许可发布