开发者问题收集

如何测试空的 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

Underscore :

_.isEmpty({}); // true

Hoek :

Hoek.deepEqual({}, {}); // true

ExtJS :

Ext.Object.isEmpty({}); // true

AngularJS (版本1)

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