You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:30:17