{} === {} 永远为 false,因为对象比较的是内存引用而非内容;正确检测空对象应使用 object.keys(obj).length === 0 等方法,而非字面量比较。

因为 obj === {} 比较的是两个独立对象的内存地址,不是内容。每次写 {} 都会创建一个新对象,哪怕看起来一模一样,它们在内存里也互不相干。
根本原因:对象比较看引用,不看结构
JavaScript 中,所有对象(包括 {}、[]、function(){})都是引用类型。=== 对引用类型只做一件事:检查两边是不是指向同一个内存位置。
-
let a = {};和let b = {};→a === b是 false -
let a = {};和let b = a;→a === b是 true(因为 b 只是 a 的另一个名字) -
{} === {}→ 永远 false(两个字面量,各自开辟新空间)
常见误用场景:登录状态判断出错
比如在 Vue 或 React 中,有人这样写条件:
v-if="userInfo === {}"if (user === {})
结果永远不成立——哪怕 userInfo 真的是空对象,这个判断也过不去。它不是“内容为空”,而是“不是同一个对象”。
正确做法是检测内容是否为空,而不是比对字面量。
安全可靠的空对象检测方法
推荐以下三种方式,按优先级排序:
- Object.keys(obj).length === 0 —— 最常用、兼容好、只关心可枚举属性(日常开发够用)
-
Object.getOwnPropertyNames(obj).length === 0 —— 能检测不可枚举属性(如
Object.defineProperty(obj, 'x', { value: 1, enumerable: false })) -
JSON.stringify(obj) === '{}' —— 简单直观,但有风险:遇到函数、
undefined、循环引用会出错或失真
额外提醒:别混淆“空对象”和“假值”
{} 本身是真值(if ({}) { ... } 会执行),所以不能靠 !obj 判断是否为空对象。它只对 null、undefined、false、0、''、NaN 返回 true。










