跳到主要内容

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

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

  • JS 的“真假”判断走 ToBoolean。
  • 只有 8 个 falsy:false、0、-0、0n、""、null、undefined、NaN。
  • 除此之外全部 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(但业务里通常不需要)