[JS]判断一个对象是否为空对象

let obj = {}

let obj1 = {
 name: "jack"
}

let obj2 = {
 [Symbol("name")]: "jack",
}

let obj3 = Object.defineProperty({}, "name", {
 value: "john",
 enumerable: false // 不可枚举
})

方法一: 利用 for...in 循环

function isEmpty(obj) {
  for (let i in Object.keys(obj)) {
    return false // 进入循环即不为空
  }
  return true
}
console.log(isEmpty(obj)) // true
console.log(isEmpty(obj1)) // false
console.log(isEmpty(obj2)) // true
console.log(isEmpty(obj3)) // true

方法二:利用JSON.stringify()转化为字符串

 let isEmpty = (obj) => (JSON.stringify(obj) === '{}') ? true : false
 
 console.log(isEmpty(obj)) // true
 console.log(isEmpty(obj1)) // false
 console.log(isEmpty(obj2)) // true
 console.log(isEmpty(obj3)) // true

方法三: 使用Object.keys()将取出对象中的键名,再判断长度

 let isEmpty = (obj) => (Object.keys(obj).length === 0) ? true : false

 console.log(isEmpty(obj)) // true
 console.log(isEmpty(obj1)) // false
 console.log(isEmpty(obj2)) // true
 console.log(isEmpty(obj3)) // true

由此可见,以上三种方法不能判断对象中的不可枚举属性。

如果对象中含有不可枚举属性,我们又需要找出这些属性,就可以使用 Object.getOwnPropertyNames() 和 Object.getOwnPropertySymbols() 这两个API。

Object.getOwnPropertyNames() 返回对象中的所有属性(不包括symbol)

Object.getOwnPropertySymbols() 只返回对象中的symbol属性

所以我们可以结合它们:

function isEmpty(obj) {
  return  !Object.getOwnPropertyNames(obj).length &&  !Object.getOwnPropertySymbols(obj).length
}

console.log(isEmpty(obj)) // true
console.log(isEmpty(obj1)) // false
console.log(isEmpty(obj2)) // false
console.log(isEmpty(obj3)) // false

你可能感兴趣的:([JS]判断一个对象是否为空对象)