1、ES6的 Object.keys()
Object.keys()
是一个对象方法,该方法返回一个数组,包含指定对象自有的可枚举属性
, 用此方法只需要判断返回的数组长度是否为0
,为0
就是空对象
let obj = {} let arr = Object.keys(obj) console.log(arr.length === 0) // true
2、JSON.stringfy()
将Javascript对象转换为JSON字符串
let obj = {} console.log(JSON.stringify(obj) === '{}') // true
这个也是最容易想到的,但是该方法有个缺点,那就是 JSON.stringify()只能序列化对象的可枚举的自有属性
,即如果有属性是不可枚举或继承属性
的话,结果也是true
如:
let obj = {} Object.defineProperty(obj, 'num', { // 添加一个不可枚举属性 value: 1, enumerable: false }) console.log(JSON.stringify(obj) === '{}') // true Object.prototype.sex = '女' // 原型上添加可枚举的属性 console.log(JSON.stringify(obj) === '{}') // true
3、Object.hasOwnPrototype()
Object.hasOwnPrototype()
用来判断指定对象自身是否含有某个属性(非继承), 继承过来的属性会被过滤掉,自身的属性
会返回的是true
let a = { name: 'xiaoming', brother: undefined } Object.prototype.sex = '男' Object.defineProperty(a, 'sister', { value: 'xiaohong', enumerable: false }) console.log(a.hasOwnProperty('name')) // true 自身属性 console.log(a.hasOwnProperty('brother')) // true console.log(a.hasOwnProperty('sex')) // false 原型链上继承的属性 console.log(a.hasOwnProperty('sister')) // true 不可枚举属性
4、Object.getOwnPropertyNames()
获取到对象中的属性名,存到一个数组中,返回数组对象,我们可以通过判断数组的length来判断此对象是否为空
let obj = {} console.log(Object.getOwnPropertyNames(obj).length === 0) // true
此外,不可没枚举的也可以检测出来
Object.defineProperty(obj, 'sister', { value: 'xiaohong', enumerable: false }) console.log(Object.getOwnPropertyNames(obj).length === 0) // false
5、for..in 循环
let obj = {} function empty () { for (let key in obj) { console.log(false, '该对象不是空对象') return false } console.log(true, '该对象是空对象') return true }
扩展:如果只考虑对象自身的属性,而不是继承来的,可以用Object.getOwnPropertyNames() 或 Object.hasOwnProperty() 来进行过滤
function empty () { for (let key in obj) { console.log(false, '该对象不是空对象') if (Object.getOwnPropertyNames().length === 0) return false } console.log(true, '该对象是空对象') return true }