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