js判断对象是否为空的几种方法

1. 使用JSON.stringify()将对象转换为json字符串

这个方法比较讨巧,也是最容易想到的。我们都知道JSON.stringify()的作用是将Javascript对象转换为JSON字符串。所以,可以通过该方法判断对象是否为空:

const obj = {}
const obj2 = new Object()

console.log(JSON.stringify(obj) === '{}')  // true
console.log(JSON.stringify(obj2) === '{}')  // true

注意:

    • 该方法有个缺点,JSON.stringify()只能序列化对象的可枚举的自有属性,即如果有属性是不可枚举或继承属性的话,结果也是true 
const obj = {}
​
// 在原型上添加一个可枚举属性
Object.prototype.name = 'Jack'
​
console.log(JSON.stringify(obj) === '{}')  // true
// 在obj对象上添加一个不可枚举属性
Object.defineProperty(obj, 'age', {
    value: 18,
    enumerable: false
})
console.log(JSON.stringify(obj) === '{}')  // true

扩展:

在实际开发项目中,我觉得JSON.stringify()的使用场景还是挺多的,比如:

    • 使用 JSON.stringify() / JSON.parse() 结合 localStorage / sessionStorage 实现对象的缓存存取;

    • 实现对象的深拷贝(注意:若对象中包含时间对象、函数、undefined等该方法存在的问题)。

    • 更多内容请移步 MDN

 

2. for…in循环

使用for...in循环遍历对象除Symbol以外的所有可枚举属性,当对象有属性存在返回false, 否则返回true。

const obj = {}
​
function isObjectEmpty(obj){
    for(var key in obj){
        return false
    }
    return true
}
console.log(isObjectEmpty(obj)) // true

在实际开发工作中,有时需要只考虑对象自身的属性,而不是继承来的,这时可以配合Object.getOwnPropertyNames() 或 Object.hasOwnProperty() 来进行过滤。

function isObjectEmpty (obj) {
    for (let key in obj) {
        if(obj.hasOwnProperty(key)) return false
    }
    return true
}

 

3. Object.getOwnPropertyNames()

Object.getOwnPropertyNames() 方法会返回该对象所有可枚举和不可枚举属性的属性名(不含Symbol属性)组成的数组。然后再通过判断返回的数组长度是否为零,如果为零的话就是空对象。

const obj = {}
console.log(Object.getOwnPropertyNames(obj).length === 0)  // true

注意:该方法对于不可枚举的属性也能检测出来。

Object.defineProperty(obj, 'age', {
    value: 18,
    enumerable: false
})
console.log(Object.getOwnPropertyNames(obj).length === 0)  // false

 

4. Object.keys()

Object.keys() 是 ES5 新增的一个对象方法,该方法返回一个数组,包含指定对象自有的可枚举属性(不含继承的和Symbol属性)。用此方法只需要判断返回的数组长度是否为零,如果为零的话就是空对象。

const obj = {}
console.log(Object.keys(obj).length === 0)  //true
​
Object.prototype.name = 'Jack'
Object.defineProperty(obj, 'age', {
    value: 18,
    enumerable: false
})
​
console.log(Object.keys(obj).length === 0)  //true

 

5. 使用外部库

有很多外部的库也可以用来检查空对象。并且,它们大多数对旧的浏览器有很好的支持。

  • jQuery 中的 isEmptyObject 方法

    jQuery.isEmptyObject({})  // true
  • Lodash的 isEmpty 方法

    _.isEmpty({})  // true

使用该方法的缺点就是需要安装额外的库。所以,根据开发情况选择适合的就好。

 

posted @ 2021-03-26 13:18  sugar_coffee  阅读(12394)  评论(0编辑  收藏  举报