在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:

var a = {};

我该如何检查是否是这种情况?


当前回答

如果您使用更新的浏览器,有一个简单的方法。对象.keys(obj).length==0

其他回答

纯Vanilla Javascript,完全向后兼容

函数isObjectDefined(Obj){如果(对象===null||对象类型!=='对象'||Object.pr原型.toString.call(Obj)==“[对象数组]”){return false}其他{for(对象中的var prop){if(对象hasOwnProperty(prop)){返回true}}返回JSON.stringify(Obj)!==JSON字符串({})}}console.log(isObjectDefined())//falseconsole.log(isObjectDefined(“”))//falseconsole.log(isObjectDefined(1))//falseconsole.log(isObjectDefined('string'))//falseconsole.log(isObjectDefined(NaN))//falseconsole.log(isObjectDefined(null))//falseconsole.log(isObjectDefined({}))//falseconsole.log(isObjectDefined([]))//falseconsole.log(isObjectDefined({a:“”}))//true

export function isObjectEmpty(obj) {
  return (
    Object.keys(obj).length === 0 &&
    Object.getOwnPropertySymbols(obj).length === 0 &&
    obj.constructor === Object
  );
}

这包括检查包含符号财产的对象。

Object.keys不检索符号财产。

我知道这并不能100%回答你的问题,但我以前也遇到过类似的问题,下面是我如何解决这些问题:

我有一个可能返回空对象的API。因为我知道从API中需要哪些字段,所以我只检查是否存在任何必需的字段。

例如:

API返回{}或{agentID:“1234”(必需),地址:“1234通道”(可选),…}。在我的调用函数中,我只检查

if(response.data && response.data.agentID) { 
  do something with my agentID 
} else { 
  is empty response
}

这样,我就不需要使用那些昂贵的方法来检查对象是否为空。如果对象没有agentID字段,则调用函数的对象将为空。

表演

今天2020.01.17,我在Chrome v79.0、Safari v13.0.4和Firefox v72.0上对macOS High Sierra 10.13.6进行了测试;对于所选的解决方案。

结论

基于for in(A,J,L,M)的解决方案最快基于JSON.stringify(B,K)的解决方案很慢令人惊讶的是,基于Object(N)的解决方案也很慢注意:此表与下面的照片不匹配。

细节

下面的代码片段中提供了15种解决方案。如果您想在机器上运行性能测试,请单击此处。该链接于2021.07.08年更新,但最初在这里进行测试,上表中的结果来自那里(但现在看起来该服务不再工作)。

var log=(s,f)=>console.log(`${s}-->{}:${f({})}{k:2}:${f({k:2})}`);函数A(obj){for(obj中的var i)返回false;返回true;}函数B(obj){返回JSON.stringify(obj)==“{}”;}函数C(obj){return Object.keys(obj).length==0;}函数D(obj){return Object.entries(obj).length==0;}函数E(obj){return Object.getOwnPropertyNames(obj).length==0;}函数F(obj){return Object.keys(obj).length==0&&obj.constructor==对象;}函数G(obj){返回obj类型==“undefined”||!布尔(Object.keys(obj)[0]);}函数H(obj){return Object.entries(obj).length==0&&obj.constructor==对象;}函数I(obj){return Object.values(obj).every((val)==>typeof val==“undefined”);}函数J(obj){for(obj中的常量键){if(hasOwnProperty.call(obj,key)){return false;}}返回true;}函数K(obj){for(obj中的var属性){if(obj.hasOwnProperty(prop)){return false;}}返回JSON.stringify(obj)==JSON.sstringify({});}函数L(obj){for(obj中的var属性){if(obj.hasOwnProperty(prop))返回false;}返回true;}函数M(obj){for(obj中的var k){如果(obj.hasOwnProperty(k)){return false;}}返回true;}函数N(obj){返回(对象.getOwnPropertyNames(obj).length==0&&对象.getOwnPropertySymbol(obj).length==0&&Object.getPrototypeOf(obj)==Object.prototype);}函数O(obj){回来(Object.getOwnPropertyNames!==未定义? Object.getOwnPropertyNames(obj).length!==0:(函数(){for(obj中的var键)break;返回键!==空键!==未定义;})());}日志(“A”,A);日志(“B”,B);日志(“C”,C);日志(“D”,D);日志(“E”,E);日志(“F”,F);日志(“G”,G);日志(“H”,H);日志(“I”,I);日志(“J”,J);log(“K”,K);日志(“L”,L);日志(“M”,M);日志(“N”,N);日志(“O”,O);

    isEmpty = function(obj) {
      if (obj == null) return true;
      if (obj.constructor.name == "Array" || obj.constructor.name == "String") return obj.length === 0;
      for (var key in obj) if (isEmpty(obj[key])) return true;
      return false;
    }

这将检查字符串、数组或对象(映射)的空性。

用法:

var a = {"a":"xxx","b":[1],"c":{"c_a":""}}
isEmpty(a); // true, because a.c.c_a is empty.
isEmpty("I am a String"); //false