判断object是否为空不仅是面试官经常容易问的也是我们项目中经常需要解决的问题,在我们工作中一般常用的方法如下:
使用Object.keys()方法判断对象是否有属性
const obj = {};
if (Object.keys(obj).length === 0) {
console.log("对象为空");
} else {
console.log("对象不为空");
}
使用for...in循环判断对象是否有属性
const obj = {};
let isEmpty = true;
for (let key in obj) {
isEmpty = false;
break;
}
if (isEmpty) {
console.log("对象为空");
} else {
console.log("对象不为空");
}
使用Object.entries()方法判断对象是否有属性
const obj = {};
if (Object.entries(obj).length === 0) {
console.log("对象为空");
} else {
console.log("对象不为空");
}
使用JSON.stringify()判断
JSON.stringify(obj) === '{}'
上面的方法在很多项目中是经常使用的方法,然而这些方法在某些情况下可能存在问题比如:
const obj = { [Symbol('a')]: 1 }
上述方法判断的结果都是对象为空,虽然这样的对象在工作中基本不会出现,但是如果你要在项目中封装通用函数,那么代码的严谨性和边缘情况的考虑是必不可少的,之所以会判断不正确是因为Symbol其目的是创建一个独一无二的标识符,这些 Symbol 属性名是不可枚举的,它们不会出现在for...in 循环、Object.keys()、Object.getOwnPropertyNames() 等方法的结果中。
这时候就可以使用Reflect.ownKeys()进行判断,使用他的原因是这个方法返回对象自身的所有属性键,无论它们是字符串还是 Symbol 类型,从而去判断object为空
const obj1 = {};
const obj2 = { [Symbol('a')]: 1 };
const obj3 = { a: 1 };
console.log(Reflect.ownKeys(obj1).length === 0); // true,因为没有任何属性
console.log(Reflect.ownKeys(obj2).length === 0); // false,因为有一个Symbol属性
console.log(Reflect.ownKeys(obj3).length === 0); // false,因为有一个字符串属性