空の JavaScript オブジェクトをテストするにはどうすればいいですか? 質問する

空の JavaScript オブジェクトをテストするにはどうすればいいですか? 質問する

AJAX リクエストの後、アプリケーションが次のような空のオブジェクトを返すことがあります。

var a = {};

それが事実かどうかはどうすれば確認できますか?

ベストアンサー1

for…inループをObject.hasOwn(で使うことができますECMA2022+ について) オブジェクトに独自のプロパティがあるかどうかを確認するテスト:

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置き換えることができますvarObject.hasOwnObject.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

ロダッシュ:

_.isEmpty({}); // true

アンダースコア:

_.isEmpty({}); // true

フック:

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

エクストJS:

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

AngularJS (バージョン 1):

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

ラムダ:

R.isEmpty({}); // true

おすすめ記事