JS判断对象是否为空

529 阅读2分钟

判断对象是否为空

后面介绍的几种方法都将基于下面所列举出来的几种数据进行介绍,主要还是使用对象的几种方法,这篇文章 juejin.cn/post/689983… 列举了对象和数组遍历的几种方法

const obj1 = {}
const obj2 = {
    name:'zs',
    age:12,
    [Symbol('address')]: '北京朝阳区'
}
const obj3 = Object.create(null)
const obj4 = Object.defineProperty({},'sex',{
    value:'男',
    enumerable: false
})
const obj5 = {
    [Symbol('desc')]: '前端代码仔'
}

【 方法1 】JSON.stringify() 将 js 对象转化为 JSON 字符串,然后在与 '{}' 进行比较

/**
 *
 * @desc 判断对象是否为空
 * @param 需要判断的对象 obj
 * @return Boolean 返回一个布尔值
 */
function objIsEmpty(obj){
    return JSON.stringify(obj) === '{}'
}


console.log(objIsEmpty(obj1))   // true
console.log(objIsEmpty(obj2))   // false
console.log(objIsEmpty(obj3))   // true
console.log(objIsEmpty(obj4))   // true
console.log(objIsEmpty(obj5))   // true

注意!!!JSON.stringify 仅会序列化可枚举的属性,不可枚举的属性默认会被忽略

const obj4 = Object.defineProperty({},'sex',{
    value:'男',
    enumerable: false
})
console.log(JSON.stringify(obj4)) // {}

【 方法2 】使用 for...in 对对象进行遍历,(该方法返回对象自身和继承的可枚举属性)

if(obj.length0){
    return false
}
for(let key  in obj) {
    if (hasOwnProperty.call(obj,key)) {
        return false;
    }
}
return true

console.log(objIsEmpty(obj1))   // true
console.log(objIsEmpty(obj2))   // false
console.log(objIsEmpty(obj3))   // true
console.log(objIsEmpty(obj4))   // true
console.log(objIsEmpty(obj5))   // true

【 方法3 】使用对象的 Object.keys() 方法 (该方法遍历对象自身可枚举的属性,不包含 Symbol 属性

function objIsEmpty(obj){
    return Object.keys(obj).length === 0
}

console.log(objIsEmpty(obj1))   // true
console.log(objIsEmpty(obj2))   // false
console.log(objIsEmpty(obj3))   // true
console.log(objIsEmpty(obj4))   // true
console.log(objIsEmpty(obj5))   // true

拓展: 遍历对象的 Symbol 属性,可以使用 Object.getOwnPropertySymbols()获取

function objIsEmpty(obj){
    return Object.keys(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0
}

console.log(objIsEmpty(obj1))   // true
console.log(objIsEmpty(obj2))   // false
console.log(objIsEmpty(obj3))   // true
console.log(objIsEmpty(obj4))   // true
console.log(objIsEmpty(obj5))   // false

【 方法4 】使用对象的 Object.getOwnPropertyNames()(该方法遍历对象自身所有的的属性,不包含 Symbol 属性

function objIsEmpty(obj){
    return Object.getOwnPropertyNames(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0
}

console.log(objIsEmpty(obj1))   // true
console.log(objIsEmpty(obj2))   // false
console.log(objIsEmpty(obj3))   // true
console.log(objIsEmpty(obj4))   // false
console.log(objIsEmpty(obj5))   // false

【 方法5 】使用 Reflect.ownKeys()(该方法对象自身的所有属性,包含 Symbol 属性

function objIsEmpty(obj){
    return Reflect.ownKeys(obj).length === 0
}

console.log(objIsEmpty(obj1))   // true
console.log(objIsEmpty(obj2))   // false
console.log(objIsEmpty(obj3))   // true
console.log(objIsEmpty(obj4))   // false
console.log(objIsEmpty(obj5))   // false