如何测试空的 JavaScript 对象?
2009-03-25
4254210
在 AJAX 请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我如何检查是否是这种情况?
3个回答
您可以将 for…in 循环与
Object.hasOwn
(
ECMA 2022+
) 测试结合使用,以检查对象是否具有任何自有属性:
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 or undefined
return false;
}
if (typeof value !== 'object') {
// boolean, number, string, function, etc.
return false;
}
const proto = Object.getPrototypeOf(value);
// consider `Object.create(null)`, commonly used as a safe map
// before `Map` support, an empty object as well as `{}`
if (proto !== null && proto !== Object.prototype) {
return false;
}
return isEmpty(value);
}
请注意,像本例中那样与
Object.prototype
进行比较将无法识别跨领域对象。
请勿使用
Object.keys(obj).length
。它的复杂度为 O(N),因为它创建一个包含所有属性名称的数组,仅用于获取该数组的长度。迭代对象可以实现相同的目标,但复杂度为 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 :
jQuery.isEmptyObject({}); // true
lodash :
_.isEmpty({}); // true
_.isEmpty({}); // true
Hoek :
Hoek.deepEqual({}, {}); // true
ExtJS :
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
Ramda :
R.isEmpty({}); // true
2015-08-20
如果
ECMAScript 5 支持
可用,则可以使用
Object.keys()
:
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
对于 ES3 及更早版本,没有简单的方法可以做到这一点。您必须明确循环遍历属性:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
Christoph
2009-03-25
对于那些有同样问题但使用 jQuery 的人,你可以使用 jQuery.isEmptyObject 。
Erik Töyrä Silfverswärd
2010-05-19