在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我如何检查是否确实如此?
你可以使用带有Object.hasOwn
(ECMA 2022+)测试的for…in循环来检查一个对象是否有任何自己的属性:
function isEmpty(obj) {
for (const prop in obj) {
if (Object.hasOwn(obj, prop)) {
return false;
}
}
return true;
}
如果你还需要区分类似于{}
的空对象和其他没有自己属性的对象(例如Date
),你可以进行各种(以及不幸的是特定于需求)类型检查:
function isEmptyObject(value) {
if (value == null) {
// null或undefined
return false;
}
if (typeof value !== 'object') {
// boolean、number、string、function等
return false;
}
const proto = Object.getPrototypeOf(value);
// 在`Map`支持之前,考虑使用`Object.create(null)`作为空对象和`{}`的安全映射
// 如果原型不是`Object.prototype`,则返回false
if (proto !== null && proto !== Object.prototype) {
return false;
}
return isEmpty(value);
}
请注意,与这个例子中的比较一样,使用Object.keys(obj).length
会失败,因为它创建了一个仅包含所有属性名称的数组,然后获取该数组的长度。迭代对象可以达到相同的目标,但复杂度为O(1)。
对于不支持ES 2022+的JavaScript引擎,可以将const
替换为var
并将Object.hasOwn
替换为Object.prototype.hasOwnProperty.call
:
function isEmpty(obj) {
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true;
}
许多流行的库还提供了用于检查空对象的函数:
jQuery.isEmptyObject({}); // true
_.isEmpty({}); // true
_.isEmpty({}); // true
Hoek:
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
标签:JavaScript,return,对象,Object,isEmpty,测试,obj,false,true
From: https://www.cnblogs.com/xiaomandujia/p/17779636.html