JavaScript 如何判断对象为空
你有没有过这种情况:打开一个新的网页,想看看浏览器缓存里有没有存数据,结果点进去一堆乱码;或者写代码时,明明想判断一个表单有没有填内容,却因为对象空不空判断错了,页面直接崩了?其实这些小问题,很多时候都和“怎么判断对象为空”有关。
很多人刚学 JavaScript 的时候,第一反应是“空对象不就是 {} 吗?直接用全等判断不就行了?”但真这么写,大概率会踩坑。比如你从接口拿数据,接口返回的是 Object.create(null),这时候你用 {} 比,明明是空的,却返回 false——这就像你用“空的陶瓷碗”和“没烧过的空陶胚”比,看起来都是空的,但本质不是一个东西。

那怎么才算真的空对象?我们得先明确:空对象就是“没有任何可枚举的自身属性”的对象。自身属性就是对象自己的东西,不是从爸爸(原型)那里借来的;可枚举属性就是能被 for...in 循环扫到的属性。搞懂这俩概念,判断方法就好理解了。
用 Object.keys() 快速判断
这个方法是新手最容易上手的,就像数碗里有没有饭:Object.keys() 会把对象的可枚举自身属性变成一个数组,只要这个数组的长度是0,就是空对象。比如:
`javascript
// 空对象
const emptyObj = {};
console.log(Object.keys(emptyObj).length === 0); // 输出 true
// 有属性的对象
const user = { name: "小明" };
console.log(Object.keys(user).length === 0); // 输出 false
`
但它也有局限:如果对象有不可枚举的属性,Object.keys() 就会忽略。比如有些老代码里的内置属性,它就看不到,这时候用这个方法就会误判。
用 JSON.stringify() 简单粗暴判断
如果你的对象里没有函数、日期这种特殊数据,用 JSON 序列化来判断也很方便,就像把碗里的饭倒出来看有没有残留:JSON.stringify() 会把对象变成字符串,空对象的字符串就是 {}, 只要等于这个字符串就是空。比如:
`javascript
const testObj = {};
console.log(JSON.stringify(testObj) === "{}"); // 输出 true
// 带方法的对象
const funcObj = { sayHi: () => "hi" };
console.log(JSON.stringify(funcObj) === "{}"); // 输出 false
`
但这个方法的坑也很明显:如果对象里有 undefined、函数,序列化会直接忽略这些属性,比如 { a: undefined, b: function(){} },序列化后会变成 {},这时候判断就会错,就像把碗里的饭和垃圾一起倒了,以为是空碗,其实有看不见的垃圾。
用 for...in 遍历彻底判断
如果要判断所有属性(包括不可枚举),就得用最“实在”的遍历方法,就像翻碗的每一个角落找饭粒:for...in 循环会遍历对象的所有可枚举属性,要是找到一个属性,就说明不是空对象。还可以配合 hasOwnProperty() 只看自身的属性,避免继承的属性干扰。比如:
`javascript
function isEmptyObj(obj) {
for (let key in obj) {
// 只判断自身的属性,排除原型的属性
if (obj.hasOwnProperty(key)) return false;
}
return true;
}
console.log(isEmptyObj({})); // 输出 true
console.log(isEmptyObj(Object.create({ a: 1 }))); // 原型有属性,但自身没有,输出 true
`
这个方法最严谨,适合复杂场景,但代码稍微多一点,就像翻碗比数饭粒要费点功夫。
避坑小Tips
最后给你提两个平时容易踩的坑:一是别用 obj == {} 或者 obj === {},因为对象是引用类型,两个空对象的内存地址不一样,就像两个一模一样的空碗,放在不同桌子上,你说它们是同一个碗,肯定不对;二是如果对象可能是 null 或 undefined,判断前得先转成对象,不然会报错,就像你想数碗里的饭,结果拿了个空碗的包装,肯定数不了。
掌握这几种方法,以后写代码时判断对象空不空,就不会再出小问题了。