Answers:
// 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.isEmptyObject({}); // true
_.isEmpty({}); // true
下划线:
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
Object.keys(new Date()).length === 0
; 所以这个答案可能会误导。
(new Date()).constructor === Date
或相反({}).constructor === Object
。
Object.keys()
不检查不可枚举的属性或符号。您需要使用Object.getOwnPropertyNames()
和Object.getOwnPropertySymbols()
。同样,这Object.getPrototypeOf()
是获取对象原型的正确方法。obj.constructor
可以很容易地伪造。范例:function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
。
没有简单的方法可以做到这一点。您必须显式地遍历属性:
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;
}
isEmpty()
,因此false
如果它具有属性,则应返回
对于那些同样的问题但使用jQuery的人,可以使用jQuery.isEmptyObject。
underscore.js
……
这是我的首选解决方案:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Object.keys(new Date()).length === 0
; 所以这个答案可能会误导。
new Date()
不是对象。nd = new Date(); nd.constructor === Object;
结果false
。
您可以使用Underscore.js。
_.isEmpty({}); // true
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
参见http://bencollier.net/2011/04/javascript-is-an-object-empty/
Object.getOwnPropertyNames(new Date()).length === 0
; 所以这个答案可能会误导。
如何使用JSON.stringify?它几乎在所有现代浏览器中都可用。
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
我只是遇到了类似情况。我不想使用JQuery,而是想使用纯Javascript做到这一点。
我所做的就是使用以下条件,它对我有用。
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
对于不等于,请使用: JSON.stringify(obj) !== '{}'
看看这个JSFiddle
旧的问题,但是有问题。如果您的唯一目的是检查对象是否为空,那么包含JQuery并不是一个好主意。相反,深入JQuery的代码,您将得到答案:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
如果您使用的是较新的浏览器,则有一种简单的方法。
Object.keys(obj).length == 0
Object.keys
是一种标准方法,但是对象没有keys属性。因此,此代码会将任何对象报告为空,除非它偶然碰巧具有一个key
用值命名的属性,而该值又又是一个length
不为零的属性。可怕!
Object.keys(new Date()).length === 0
; 所以这个答案可能会误导。
对于空对象,使用Object.keys(obj).length(如上文ECMA 5+所建议)的速度要慢10倍!保持老派的选择。
经过在Node,Chrome,Firefox和IE 9下的测试,很明显对于大多数用例:
底线性能明智,请使用:
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;
}
请参阅“对象为空吗?”中的详细测试结果和测试代码。
Object.keys
速度很慢,但是代码较少。在一个小的页面上,这可能被称为...可能是10次...考虑到额外代码的额外解析时间,这是否还会变慢?
今天,2020.01.17我针对选定的解决方案在Chrome v79.0,Safari v13.0.4和Firefox v72.0的MacOs HighSierra 10.13.6上执行测试。
结论
for-in
(A,J,L,M)的解决方案最快JSON.stringify
(B,K)的解决方案很慢Object
是,基于(N)的解决方案也很慢下面的代码段中提供了15种解决方案。如果要在计算机上运行性能测试,请单击此处。
您可以检查对象键的数量:
if (Object.keys(a).length > 0) {
// not empty
}
只是一种解决方法。如果没有数据,您的服务器能否生成一些特殊属性?
例如:
var a = {empty:true};
然后,您可以轻松地在AJAX回调代码中对其进行检查。
另一种检查方法:
if (a.toSource() === "({})") // then 'a' is empty
编辑:如果您使用任何JSON库(fe JSON.js),则可以尝试JSON.encode()函数并针对空值字符串测试结果。
toSource()
是非标准的,并且不能在IE或Opera(以及可能未检查的其他浏览器)中使用
toSource
在15.2.4节中列出属性;根据MDC的说法,它是在JS1.3(即Netscape Navigator 4.06)中引入的,但不是在ECMA-262第三版中!
toSource()
也是这样做的一种可怕方法(原样JSON.encode()
)。它需要构建一个代表整个对象的字符串,以检查它是否为空。将事物转换为字符串会产生开销,但是如果您的对象具有一百万个属性,则还需要转换一百万个事物,而实际上仅查看一个对象就会知道它不是空的。
我创建了一个完整的函数来确定对象是否为空。
它使用Object.keys
从ECMAScript中5(ES5)功能,如果可能的话,以达到最佳性能(见兼容性表)并回退给老式引擎(浏览器)最兼容的方法。
/**
* Returns true if specified object has no properties,
* false otherwise.
*
* @param {object} object
* @returns {boolean}
*/
function isObjectEmpty(object)
{
if ('object' !== typeof object) {
throw new Error('Object must be specified.');
}
if (null === object) {
return true;
}
if ('undefined' !== Object.keys) {
// Using ECMAScript 5 feature.
return (0 === Object.keys(object).length);
} else {
// Using legacy compatibility mode.
for (var key in object) {
if (object.hasOwnProperty(key)) {
return false;
}
}
return true;
}
}
这是此代码的要点。
这是带有演示和简单测试的JSFiddle。
希望对您有所帮助。干杯!
Object.keys(new Date()).length === 0
; 所以这个答案可能会误导。
我正在用这个。
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;
}
下面的示例演示如何测试JavaScript对象是否为空,如果为空,则意味着我们没有自己的属性。
该脚本可在ES6上运行。
const isEmpty = (obj) => {
if (obj === null ||
obj === undefined ||
Array.isArray(obj) ||
typeof obj !== 'object'
) {
return true;
}
return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty('')); // true
console.log(isEmpty(33)); // true
console.log(isEmpty([])); // true
console.log(isEmpty({})); // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello')); // true
console.log(isEmpty([1, 2, 3])); // true
console.log(isEmpty({ test: 1 })); // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date())); // true
console.log(isEmpty(Infinity)); // true
console.log(isEmpty(null)); // true
console.log(isEmpty(undefined)); // true
根据Object.entries()上的ES2017规范,使用任何现代浏览器均可轻松进行检查-
Object.entries({}).length === 0
Object.keys
或this有什么好处Object.values
?
jQuery isEmptyObject()
在这种情况下具有特殊功能:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
我会去检查它是否至少有一把钥匙。这就足以告诉我它不是空的。
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
false
值怎么办?结果将false
是不正确的。
在幕后,所有库中的所有空检查方法都使用对象键检查逻辑。使它易于理解是一种奇怪的方式,您可以将其放入方法中,在此进行描述。
for(key in obj){
//your work here.
break;
}
在ES5中得到了发展,现在可以简单地使用Object.Keys
将对象作为参数的方法来检查对象的密钥长度:
if(Object.keys(obj).length > 0){
//do your work here
}
或者,如果您正在使用Lodash(必须),则使用。
_.isEmpty(obj) //==true or false
您可以使用不使用jQuery或其他库的简单代码
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
JSON类及其功能(解析和字符串化)非常有用,但是IE7存在一些问题,您可以使用此简单代码http://www.json.org/js.html对其进行修复。
其他简单方式(simplest Way):
您可以使用这种方式而无需使用jQuery或JSON对象。
var a=({});
function isEmptyObject(obj) {
if(typeof obj!='object') {
//it is not object, so is not empty
return false;
} else {
var x,i=0;
for(x in obj) {
i++;
}
if(i>0) {
//this object has some properties or methods
return false;
} else {
//this object has not any property or method
return true;
}
}
}
alert(isEmptyObject(a)); //true is alerted
我发现的最好方法:
function isEmpty(obj)
{
if (!obj)
{
return true;
}
if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
{
return true;
}
return false;
}
效劳于:
t1: {} -> true
t2: {0:1} -: false
t3: [] -> true
t4: [2] -> false
t5: null -> true
t6: undefined -> true
t7: "" -> true
t8: "a" -> false
t9: 0 -> true
t10: 1 -> false
if (!obj && obj !== 0)
。
我的看法:
function isEmpty(obj) {
return !Object.keys(obj).length > 0;
}
var a = {a:1, b:2}
var b = {}
console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true
只是,我不认为Object.keys()
目前所有的浏览器都可以实现。
Object.keys(new Date()).length === 0
; 所以这个答案可能会误导。
如果jQuery和Web浏览器不可用,则underscore.js中还有一个isEmpty函数。
_.isEmpty({}) // returns true
此外,它不假定输入参数为对象。对于列表或字符串或未定义的列表,它也会提供正确的答案。
除了Thevs答案:
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
这是jquery + jquery.json
$.isEmptyObject()
,请使用,不要浪费时间进行非显而易见的转换。