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

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

var a = {};

如何检查情况呢?

乐Near2020/03/09 13:20:45

If jQuery and the web browser is not available, there is also an isEmpty function in underscore.js.

_.isEmpty({}) // returns true

Additionally, it does not assume the input parameter to be an object. For a list or string or undefined, it will also turn the correct answer.

西里Near2020/03/09 13:20:45

jQuery isEmptyObject()在这种情况下具有特殊功能

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

进一步了解http://api.jquery.com/jQuery.isEmptyObject/

小宇宙前端2020/03/09 13:20:45

我会去检查它是否至少有一把钥匙。这就足以告诉我它不是空的。

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
神无伽罗阳光2020/03/09 13:20:45
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
不知2020/03/09 13:20:45

根据Object.entries()ES2017规范,使用任何现代浏览器均可轻松进行检查-

Object.entries({}).length === 0
TomEva2020/03/09 13:20:45

我正在用这个。

function isObjectEmpty(object) {
  var isEmpty = true;
  for (keys in object) {
     isEmpty = false;
     break; // exiting since we found that the object is not empty
  }
  return isEmpty;
}

例如:

var myObject = {}; // Object is empty
var isEmpty  = isObjectEmpty(myObject); // will return true;

// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"}; 

// check if the object is empty
isEmpty  = isObjectEmpty(myObject); // will return false;

从这里

更新资料

要么

您可以使用isEmptyObject的jQuery实现

function isEmptyObject(obj) {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}
小卤蛋宝儿2020/03/09 13:20:44

旧的问题,但是有问题。如果您唯一的目的是检查对象是否为空,那么包含JQuery并不是一个好主意。相反,只需深入JQuery的代码,您就会得到答案:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}
十三西门2020/03/09 13:20:44

对于空对象,使用Object.keys(obj).length(如上文ECMA 5+所建议)的速度要慢10倍!保持旧学校(for ... in)的选择。

经过在Node,Chrome,Firefox和IE 9下的测试,很明显对于大多数用例:

  • (for ... in ...)是最快的选择!
  • 空对象的Object.keys(obj).length慢10倍
  • JSON.stringify(obj).length总是最慢的(不令人惊讶
  • 在某些系统上,Object.getOwnPropertyNames(obj).length花费的时间比Object.keys(obj).length可以更长。

明智地使用底线,请使用:

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

要么

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

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

达蒙理查德2020/03/09 13:20:44

您可以检查对象键的数量:

if (Object.keys(a).length > 0) {
    // not empty
}
番长GO2020/03/09 13:20:44

如果您使用的是较新的浏览器,则有一种简单的方法。 Object.keys(obj).length == 0

GreenGil2020/03/09 13:20:44

这是我的首选解决方案:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
猿AJim2020/03/09 13:20:44

您可以使用Underscore.js

_.isEmpty({}); // true
伽罗理查德2020/03/09 13:20:44

ECMA 5+

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

不过请注意,这会创建不必要的数组(的返回值keys)。

ECMA 5之前的版本:

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

  return JSON.stringify(obj) === JSON.stringify({});
}

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
Davaid番长十三2020/03/09 13:20:44

对于那些同样的问题但使用jQuery的人,可以使用jQuery.isEmptyObject

逆天伽罗宝儿2020/03/09 13:20:44
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

参见http://bencollier.net/2011/04/javascript-is-an-object-empty/

前端神无2020/03/09 13:20:44

没有简单的方法可以做到这一点。您必须显式地遍历属性:

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

    return true;
}

如果有ECMAScript 5支持,则可以Object.keys()改用:

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