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

var a = {};

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


当前回答

警告当心JSON的限制。

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

显示器

    Beware!! obj is NOT empty!

    obj = {  f:function(){}  }

    JSON.stringify( obj )

    returns

    {}

其他回答

表演

今天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);

function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}

我的看法:

函数isEmpty(obj){return Object.keys(obj).length==0;}变量a={a: 1中,b: 2个}变量b={}console.log(isEmpty(a));//假的console.log(isEmpty(b));//真的

只是,我认为目前并不是所有浏览器都实现Object.keys()。

完美的故障保护解决方案

我认为第一个被接受的解决方案在大多数情况下都有效,但不是故障保护。

更好的故障安全解决方案将是。

function isEmptyObject() { 
  return toString.call(obj) === "[object Object]" 
  && Object.keys(obj).length === 0;
}

或ES6/7

const isEmptyObject = () => toString.call(obj) === "[object Object]" 
  && Object.keys(obj).length === 0;

使用这种方法,如果obj设置为undefined或null,则代码不会中断。并返回null。

您可以在使用对象原型之前或代码开始时定义自己的对象原型。

定义应如下所示:

Object.prototype.hasOwnProperties=函数(){ for(此处为var k){ 如果(this.hasOwnProperty(k)){ 返回true;} }return false;}

下面是一个用法示例:

变量a={};while(a.status!==“完成”){ if(状态==“正在处理”){a.status=“完成”;}if(状态==“启动”){a.status=“正在处理”;}如果(!a.hasOwnProperties()){a.status=“正在启动”;}}

享受!:-)