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