转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(但业务里通常不需要)