空数组和空对象需先类型判断再结构检查:用Array.isArray()识别数组,纯对象需满足非null、typeof为'object'且非数组;空数组判length===0,空对象判Object.keys().length===0。

直接用 if(obj) 或 if(arr) 无法区分空对象和空数组,因为两者转布尔值都是 true,且 typeof 都返回 "object"。必须结合类型识别与结构检查才能准确判断。
先确认是不是数组
最可靠的方式是使用 Array.isArray():
-
Array.isArray([])→ true -
Array.isArray({})→ false - 比
instanceof Array更安全(避免跨 iframe 问题) - 比
obj.constructor === Array更健壮(防止 constructor 被篡改)
再确认是不是纯对象
要排除数组、null、基本类型后,再验证是否为普通对象:
- 先排除 null:
obj !== null - 再确认类型:
typeof obj === 'object' - 最后排除数组:
!Array.isArray(obj) - 三者同时满足,才可认为是“纯对象”(即非数组的 Object 实例)
分别判断是否为空
类型明确后,再检查内容是否为空:
立即学习“Java免费学习笔记(深入)”;
- 空数组:已知是数组 →
arr.length === 0 - 空对象:已知是纯对象 →
Object.keys(obj).length === 0 - 注意:
Object.keys()只枚举自身可枚举属性,不包含原型链上的属性,符合“空对象”的常规语义 - 避免用
JSON.stringify(obj) === '{}',它对含undefined或函数的属性会误判为空
组合成安全判断函数
实际开发中建议封装逻辑,兼顾未定义、null 等边界情况:
-
if (Array.isArray(data) && data.length === 0)→ 空数组 -
if (data !== null && typeof data === 'object' && !Array.isArray(data) && Object.keys(data).length === 0)→ 空对象 - 若需统一判空,可扩展支持 Map、Set、字符串等,但核心仍是“先定型,再查结构”


















