1、通过JSON.stringify()判断
可以使用JSON.stringify()
将Javascript对象转换为JSON字符串。通过字符串判断对象是否为空。但需要注意有属性是不可枚举或继承的问题。
const obj1 = {}
const obj2 = new Object()
console.log(JSON.stringify(obj1) === '{}') // true
console.log(JSON.stringify(obj2) === '{}') // true
// 在原型上添加一个可枚举属性
Object.prototype.name = 'cjavapy'
console.log(JSON.stringify(obj) === '{}') // true
const obj = {}
// 在obj对象上添加一个不可枚举属性
Object.defineProperty(obj, 'class', {
value: 18,
enumerable: false
})
console.log(JSON.stringify(obj) === '{}') // true
2、通过for…in判断
可以使用for...in循环遍历对象所有可枚举属性(除Symbol以外),当对象有属性存在返回false, 否则返回true。
1)不考虑继承
const obj = {}
function isObjectEmpty(obj){
for(var key in obj){
return false
}
return true
}
console.log(isObjectEmpty(obj)) // true
2)继承属性
const obj = {}
Object.prototype.name = 'cjavapy'
function isObjectEmpty (obj) {
for (let key in obj) {
if(obj.hasOwnProperty(key)) return false
}
return true
}
function isObjectEmpty1 (obj) {
for (let key in obj) {
return false
}
return true
}
console.log(isObjectEmpty(obj)) // true
console.log(isObjectEmpty1(obj)) // false
3、通过Object.getOwnPropertyNames()判断
Object.getOwnPropertyNames()
方法会返回该对象所有可枚举和不可枚举属性的属性名(不含Symbol属性)组成的数组。然后通数组的长度判断就可以,如下,
const obj = {}
Object.prototype.name = 'cjavapy'
console.log(Object.getOwnPropertyNames(obj).length === 0) // true
//不可枚举的属性也能判断
Object.defineProperty(obj, 'class', {
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 = 'cjavapy'
Object.defineProperty(obj, 'class', {
value: 18,
enumerable: false
})
console.log(Object.keys(obj).length === 0) //true