空数组[]和空对象{}在布尔上下文中为true,因所有对象ToBoolean转true;但[]==true为false,因==先转数字得0==1;安全判断需显式检查length或Object.keys().length。

空数组 [] 和空对象 {} 在 JavaScript 中的布尔值都是 true,这和直觉相悖,也常导致条件判断出错。关键不是它们“空”,而是它们属于引用类型(object),而所有对象在布尔上下文中都转为 true。
为什么 if([]) 会进分支,但 [] == true 却是 false?
这是两类不同机制:
-
if([]) 触发的是 ToBoolean 转换:所有对象(包括
[]、{}、new Date())一律转为true; -
[] == true 触发的是 抽象相等(==)算法:先将两边转为数字,
Number([])是0,Number(true)是1,所以结果是false; - 同理:
[] == false→0 == 0→true;{} == false→NaN == 0→false。
典型误判场景与写法陷阱
这些代码表面合理,实则危险:
-
if (arr) { /* 处理数组 */ }—— 空数组也会进,但你本意可能是“非空才处理”; -
if (obj && obj.length)—— 对象没有length,报错; -
if (data == true)或if (data === true)——[]永远不等于布尔字面量; -
!arr判断“是否为空”——![]是false,完全反了。
安全识别空数组与空对象的方法
不要依赖布尔转换,要针对结构做显式检查:
-
空数组:用
Array.isArray(arr) && arr.length === 0; -
空对象:用
obj !== null && typeof obj === 'object' && !Array.isArray(obj) && Object.keys(obj).length === 0; - 更简洁可复用的写法(ES2017+):
const isEmpty = val => val == null ? true : Array.isArray(val) ? val.length === 0 : typeof val === 'object' ? Object.keys(val).length === 0 : false;
接口响应容错时的常见坑
后端返回 {} 或 [] 常表示“无数据”,但直接 if (res) {...} 会误认为有数据:
- ❌ 错误:
if (response.data) console.log('有数据')——response.data = []也会打印; - ✅ 正确:
if (Array.isArray(response.data) && response.data.length)或if (response.data && typeof response.data === 'object' && Object.keys(response.data).length); - 建议统一封装工具函数,避免每个地方重复写冗长判断。

















