JavaScript中if([])为真,因空数组不在6个falsy值(false、0、0n、""、null、undefined)之列;所有对象(含[]、{})默认truthy;而[]==false为真因抽象相等规则将二者均转为0。
![如何识别 if ([]) 为真 这一初学者最容易混淆的原始类型逻辑](https://img.php.cn/upload/article/001/242/473/177924190725485.png?x-oss-process=image/resize,p_40)
在 JavaScript 中,if([]) 会被判定为“真”,这和初学者直觉相悖——毕竟空数组看起来“什么都没有”。但关键在于:JavaScript 的 if 判定不看“内容是否为空”,而看“该值是否属于“falsy”(假值)列表。只有明确列在 falsy 值中的几个原始值才会被当作假,其余全是真,包括 []、{}、new Date()、function(){} 等所有对象(含数组)。
JavaScript 中仅有的 6 个 falsy 值
它们是且仅是:
-
false(布尔假) -
0和-0(数字零) -
0n(BigInt 零) -
""(空字符串) nullundefined
注意:[] 不在其中,{} 不在其中,NaN 虽然“不是数字”,但它也不是 falsy 值(if(NaN) 仍为真)。
为什么 [] 是真,而 [] == false 却成立?
这是最容易绕晕人的点:真假判断(if)和相等比较(==)遵循完全不同的规则。
-
if([])→ 查 falsy 表 →[]不在表中 → 真 -
[] == false→ 触发抽象相等算法:先将false转为0,再将[]调用toString()得到"",再转为0→0 == 0→ 真
所以 if([] == false) 是真,但 if([]) 也是真 —— 两者不矛盾,只是机制不同。别用 == 推测 if 行为。
如何安全地判断“数组是否为空”?
想检查数组有没有元素,必须显式比对长度:
- ✅ 正确:
if (arr.length === 0)或if (arr.length)(非零为真,即“有元素”) - ❌ 错误:
if (!arr)(永远假,因为数组是对象,必为真) - ❌ 危险:
if (!arr.length)(可读,但依赖 length 属性;若 length 被篡改会出错) - ⚠️ 注意:
Array.isArray(arr) && arr.length === 0更健壮,尤其当你不确定变量是否真是数组时
延伸提醒:其他常见“看似空实为真”的情况
同样原理适用于:
-
if({})→ 真(空对象) -
if(new Boolean(false))→ 真(包装对象,非原始布尔值) -
if(new String(""))→ 真(空字符串对象) -
if(/ /)→ 真(正则字面量,总是真)
核心口诀:只要不是那 6 个 falsy 值,哪怕看起来“空”“零”“无效”,在 if 里都按“真”处理。










