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

var a = {};

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


当前回答

1.使用Object.keys

Object.keys将返回一个数组,其中包含对象的属性名。如果数组的长度为0,那么我们知道对象是空的。

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

我们还可以使用Object.values和Object.entries检查这一点。这通常是确定对象是否为空的最简单方法。

2.使用for…in循环对象财产

for…in语句将循环通过对象的可枚举属性。

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

在上面的代码中,我们将循环遍历对象财产,如果一个对象至少有一个属性,那么它将进入循环并返回false。如果对象没有任何财产,那么它将返回true。

#3.使用JSON.stringify如果我们将对象字符串化,结果只是一个左括号和右括号,那么我们就知道对象是空的。

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

4.使用jQuery

jQuery.isEmptyObject(obj); 

5.使用Undercore和Lodash

_.isEmpty(obj);

资源

其他回答

对于空对象,使用Object.keys(obj).length(如上面针对ECMA5+所建议的)要慢10倍!保持老学校的选择。

在Node、Chrome、Firefox和IE 9下测试,很明显,对于大多数使用情况:

(for…in…)是使用最快的选项!空对象的Object.keys(obj).length慢10倍JSON.stringify(obj).length总是最慢的(不令人惊讶)Object.getOwnPropertyNames(obj).length比Object.keys(obk)长。在某些系统上,长度可能更长。

就性能而言,使用:

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

or

function isEmpty(obj) {
   for (var x in obj) { if (obj.hasOwnProperty(x))  return false; }
   return true;
}

请参阅“对象为空吗?”中的详细测试结果和测试代码?

纯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

警告当心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

    {}

这里有一个快速、简单的函数:

function isEmptyFunction () {
  for (const i in this) return false
  return true
}

作为getter实现:

Object.defineProperty(Object.prototype, 'isEmpty', { get: isEmptyFunction })

console.log({}.isEmpty) // true

作为单独的功能实现:

const isEmpty = Function.prototype.call.bind(isEmptyFunction)

console.log(isEmpty({})) // true

jQuery在这种情况下具有特殊的函数isEmptyObject():

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

阅读更多信息http://api.jquery.com/jQuery.isEmptyObject/