JavaScript中如何判断对象的属性值是否为空对象?
判断对象是否为空的几种实现方案
嘿,这个需求很常见,我来给你分享几种靠谱的实现方式,你可以根据自己的运行环境和场景来选择:
方法1:使用Object.keys()(推荐,现代浏览器)
这是最简洁高效的方案,现代浏览器(包括ES5及以上环境)都支持:
var obj = {newData : {}}; // 直接写if条件,返回布尔值 const isEmpty = Object.keys(obj.newData).length === 0; console.log(isEmpty); // 输出 true
原理说明
Object.keys()会返回一个包含对象自身可枚举属性的数组,如果目标是空对象,这个数组的长度就是0,直接判断长度就能得出结果。绝大多数业务场景下,这个方法完全够用。
方法2:兼容旧环境的for-in循环方案
如果你的代码需要兼容IE8及这类旧环境,Object.keys()不支持,那就可以用for-in循环配合hasOwnProperty()来判断:
var obj = {newData : {}}; // 先写一个工具函数 function isEmptyObject(target) { for (var key in target) { // 只检查对象自身的属性,排除继承来的属性 if (target.hasOwnProperty(key)) { return false; } } return true; } // 调用工具函数做判断 const isEmpty = isEmptyObject(obj.newData); console.log(isEmpty); // 输出 true
原理说明
遍历对象的所有属性,只要找到一个属于对象自身的属性,就说明它不是空对象,直接返回false;如果遍历完都没找到,就返回true。这个方法兼容性拉满,但代码量稍多一点。
方法3:慎用JSON.stringify()
还有一种看起来简单的写法,但不推荐在严谨场景使用:
var obj = {newData : {}}; const isEmpty = JSON.stringify(obj.newData) === '{}'; console.log(isEmpty); // 输出 true
为什么不推荐?
如果对象里包含undefined、函数或者循环引用这类特殊值,JSON.stringify()会把它们忽略或者报错,导致误判。比如{a: undefined}经过JSON.stringify()后也会变成{},但实际上这个对象并不是空的。
内容的提问来源于stack exchange,提问作者Bhaurao Birajdar
相关产品推荐
相关产品推荐

