如何测试一个空的JavaScript对象?

发布时间 2023-10-21 22:02:48作者: 小满独家

内容来自 DOC https://q.houxu6.top/?s=如何测试一个空的JavaScript对象?

在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:

jQuery.isEmptyObject({}); // true

lodash:

_.isEmpty({}); // true

Underscore:

_.isEmpty({}); // true

Hoek:

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

ExtJS:

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

AngularJS (version 1):

angular.equals({}, {}); // true

Ramda:

R.isEmpty({}); // true