前言

很多时候会遇到空对象{}的情况,怎么样才能够很好的判断呢

前置条件

现在有三个对象

const obj = {}
 
const obj1 = {
    name: 'Hello',
    age: 20
}
 
const obj2 = {
    name: 'World'
    age: 20
}
 
Object.defineProperty(obj2, 'name', {
    enumerable: false,
});
 
Object.defineProperty(obj2, 'age', {
    enumerable: false,
});
 

编写方法

现在我们用不同的方法来判断

Function 1

我们可以使用JSON.stringify(obj)

const isEmptyJSON = (prop) => JSON.stringify(prop) === '{}';

Function 2

我们可以利用ES6中的 Object.keys()

const isEmptyObjEs6 = (prop) => Object.keys(prop).length === 0;

Function 3

我们可以利用for in来遍历对象

const isEmptyForIn = (prop) => {
  for (const key in prop) {
    return false;
  }
  return true;
};
 
// jquery中就是此方法

Function 4

我们可以利用Object.getOwnPropertyNames()

const isEmptyGetOwnPropertyNames = (prop) =>
  Object.getOwnPropertyNames(prop).length === 0;

校验

isEmptyJSON(obj); // true
isEmptyJSON(obj1); // false
isEmptyJSON(obj2); // true
 
isEmptyObjEs6(obj); // true
isEmptyObjEs6(obj1); // false
isEmptyObjEs6(obj2); // true
 
isEmptyForIn(obj); // true
isEmptyForIn(obj1); // false
isEmptyForIn(obj2); // true
 
isEmptyGetOwnPropertyNames(obj); // true
isEmptyGetOwnPropertyNames(obj1); // false
isEmptyGetOwnPropertyNames(obj2); // false

分析

首先objobj1各个函数都是准确的判断了 唯一的区别就是obj2的判断 那么obj1obj2有什么区别呢,我只是将 obj2 的属性变成了不可枚举的因此出现了差异化 所以我们也可以推断出前面三个JSON.stringify Object.keys() for in都只能遍历对象的可枚举的属性 如果不可枚举是无法遍历的,因此对于他们来说,就是个空对象 但是Object.getOwnPropertyNames()可以便利对象上的不可枚举属性,所以能够准确的判断出该对象并不是空 注意,在obj2中虽然是不可枚举的,但是依旧是可以访问的

obj2.name; // World

写在后面

其实大部分时候我们可以通过Object.keys()来判断是否为空,但是可能有些情况比较特殊,所以多学一点方法还是很OK