跳到主要内容

转Boolean:哪些值是 truthy / falsy?if 到底怎么判断?

面试速答(30 秒版 TL;DR)

  • JS 的“真假”判断走 ToBoolean
  • 只有 8 个 falsyfalse0-00n""nullundefinedNaN
  • 除此之外全部 truthy:包括 []{}"0""false"

一句话心智模型

if (x) 判断的不是“x 是不是等于 true”,而是“把 x 转成 Boolean 后是否为 true”。


falsy 清单(背下来)

Boolean(false); // false
Boolean(0); // false
Boolean(-0); // false
Boolean(0n); // false
Boolean(""); // false
Boolean(null); // false
Boolean(undefined); // false
Boolean(NaN); // false

典型题 & 标准答法

Q1:[]{}if 里是什么?

都是真:

if ([]) console.log("[] truthy");
if ({}) console.log("{} truthy");

解释口径:

  • 对象在 ToBoolean 下永远是 true(历史特例 document.all 除外,通常不作为业务口径)。

Q2:"0""false" 呢?

只要非空字符串都是真:

Boolean("0"); // true
Boolean("false"); // true

Q3:为什么 !!x 能把值变成 boolean?

  • !x 先 ToBoolean 再取反
  • !!x 等价于 Boolean(x)

常见误区(面试会追问)

误区 1:把“空数组/空对象”当成 false

[]{} 都是 truthy,所以:

if ([]) {
// 会进来
}

如果要判断“数组是否为空”,必须显式写 arr.length === 0

误区 2:把 == true/false 当成布尔判断

== 会引入 ToNumber/ToPrimitive,结果很绕。建议:

  • 想判断真假:用 if (x)Boolean(x)
  • 想判断严格为 true:用 x === true(但业务里通常不需要)