JavaScript 中 如何判断一个对象是空对象
-
利用 for...in 判断
function isEmptyObject(object) { for (let key in object) { return false; // 能遍历,对象不为空 } return true; }
思路:利用for in 循环遍历对象和对象原型上的可枚举属性;
缺点:只能遍历可枚举属性,若一个对象上只有不可枚举属性的话,会判断错误; -
利用 Object.keys() 判断
function isEmptyObject(object) { return Object.keys(object).length === 0; }
思路:Object.keys 能返回对象自身上所有可枚举属性的名称所构成的数组, 若数组长度为0,那就是一个空对象;
缺点:如 for...in 判断一样,Object.keys 方法也只返回可枚举属性; -
将对象转化为json字符串
function isEmptyObject(object) { return JSON.stringify(object) === "{}"; }
-
利用 Object.getOwnPropertyNames() 判断
function isEmptyObject(object) { return Object.getOwnPropertyNames(object).length === 0; }
思路: Object.getOwnPropertyNames 方法获取到对象中的属性名,存到一个数组中,返回数组对象,若数组长度为0,则是空对象;
缺点: Object.getOwnPropertyNames 方法是 Object.keys 的改进,可获取到不可枚举属性,但该方法无法获取 Symbol 属性; -
利用 Reflect.ownKeys() 判断
function isEmptyObject(object) { return Reflect.ownKeys(object).length === 0; }
思路: Reflect.ownKeys 也可以返回对象自身属性名所构成的数组,该方法可以返回不可枚举属性以及 Symbol 属性;
[延伸知识点]
什么是可枚举属性,什么是不可枚举属性:
可枚举属性是指内部可枚举标志 (enumerable) 设置为 true 的属性,不可枚举属性即是 enumerable 为 false;
js遍历对象方法区别总结:
方法 | 基本属性 | 原型链属性 | 不可枚举属性 | symbol属性 |
---|---|---|---|---|
for...in | √ | √ | × | × |
Object.keys() | √ | × | × | × |
Object.getOwnPropertyNames() | √ | × | √ | × |
Object.Object.getOwnPropertySymbols()() | × | × | √ | √ |
Reflect.ownKeys() | √ | × | √ | √ |