在JavaScript中,直接使用obj === {}判断空对象总会得到false,因为对象比较的是内存引用而非内容。正确做法需借助Object.keys()等方法检测属性数量,本文详解原因并提供可靠方案。
根本原因在于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.defineProperty(obj, 'x', { value: 1, enumerable: false }))undefined、循环引用会出错或失真总而言之,检测空对象应选用Object.keys等可靠方法,避免直接比较字面量。同时注意{}本身是真值,不能依靠!obj判断,需通过属性数量或JSON.stringify确认。理解引用类型比较机制是避开这一陷阱的关键。