JavaScript如何判断数组是否仅包含空对象
判断失效的核心原因
list[0] == {}永远返回false,本质是JavaScript的类型比较规则:
- 原始类型(字符串、数字、布尔值、null、undefined、Symbol、BigInt)比较时,对比的是值本身
- 对象(包括普通对象、数组、函数等)属于引用类型,
==和===比较时只会对比两个值的内存引用地址,不会对比内部的键值对内容
你代码里写的{}是判断语句执行时临时创建的全新对象实例,和list[0]指向的内存地址完全不同,自然不可能相等。哪怕两个对象内容完全一致,只要不是同一个引用,比较结果都是false。
单个空对象的判断方法
优先用原生API实现,不需要额外依赖:
const isEmptyObj = (obj) => { // 先拦截null、非对象类型的边界值,避免执行报错 return !!obj && typeof obj === 'object' && Object.keys(obj).length === 0 }
如果你的场景需要覆盖不可枚举属性、Symbol键的情况,把Object.keys(obj)替换成Reflect.ownKeys(obj)即可,能拿到对象自身所有属性,不受枚举性、键类型影响。
如果项目已经引入了Lodash工具库,直接调用_.isEmpty(target)即可,这个方法已经兼容了null、非对象值、空数组、空集合等各种边界场景,不需要自己写额外判断。
检查数组内所有对象均为空的方案
结合数组的every方法即可,只有数组所有元素都满足空对象判断时,才会返回true:
// 原生实现 const isAllEmptyObj = (arr) => { return arr.every(item => !!item && typeof item === 'object' && Object.keys(item).length === 0) } // 引入Lodash的简化写法 const isAllEmptyObj = (arr) => arr.every(_.isEmpty)
使用示例:
console.log(isAllEmptyObj([{}, {}, {}])) // true console.log(isAllEmptyObj([{}, { id: 1 }, {}])) // false
补充注意:React开发中控制台打印对象存在延迟求值的特性,如果你在打印语句之后修改过
list[0]的属性,控制台展示的{}可能不是执行打印语句那一刻的真实值,调试时建议直接打印JSON.stringify(list[0])拿到即时快照,避免被控制台展示误导。
内容的提问来源于stack exchange,提问作者aj soprano
相关产品推荐
相关产品推荐

