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

var a = {};

如何检查情况呢?


#1楼

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


#2楼

我正在用这个。

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;}

#3楼

Sugar.JS为此提供了扩展对象。 代码简洁明了:

制作一个扩展对象:

a = Object.extended({})

检查它的大小:

a.size()

#4楼

如何使用JSON.stringify? 它几乎在所有现代浏览器中都可用。

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

#5楼

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

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

#6楼

您可以使用不使用jQuery或其他库的简单代码

var a=({});//check is an empty object
if(JSON.stringify(a)=='{}') {alert('it is empty');
} else {alert('it is not empty');
}

JSON类及其功能( parsestringify )非常有用,但是IE7存在一些问题,您可以使用此简单代码http://www.json.org/js.html对其进行修复。

其他简单方式(最简单的方式):
您可以使用这种方式,而无需使用jQueryJSON对象。

var a=({});function isEmptyObject(obj) {if(typeof obj!='object') {//it is not object, so is not emptyreturn false;} else {var x,i=0;for(x in obj) {i++;}if(i>0) {//this object has some properties or methodsreturn false;} else {//this object has not any property or methodreturn true;}}
}alert(isEmptyObject(a));    //true is alerted

#7楼

if(Object.getOwnPropertyNames(obj).length === 0){//is empty
}

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


#8楼

如果jQuery和Web浏览器不可用,则underscore.js中还有一个isEmpty函数。

_.isEmpty({}) // returns true

此外,它不假定输入参数为对象。 对于列表或字符串或未定义的列表,它也会提供正确的答案。


#9楼

除了Thevs答案:

var o = {};
alert($.toJSON(o)=='{}'); // truevar o = {a:1};
alert($.toJSON(o)=='{}'); // false

这是jquery + jquery.json


#10楼

在幕后,所有库中的所有空检查方法都使用对象键检查逻辑。 使它易于理解是一种奇怪的方式,您可以将其放入方法中, 在此进行描述。

for(key in obj){//your work here.break;
}

它在ES5中得到了发展,现在可以简单地使用Object.Keys方法检查对象的键长, Object.Keys方法将对象作为参数:

if(Object.keys(obj).length > 0){//do your work here
}

或者,如果您正在使用Lodash (必须),则使用。

 _.isEmpty(obj) //==true or false

#11楼

我创建了一个完整的函数来确定对象是否为空。

如果可能,它将使用ECMAScript 5 (ES5)功能的Object.keys以获得最佳性能(请参阅兼容性表 ),并回退到旧引擎(浏览器)的最兼容方法。

/*** 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 。

希望对您有所帮助。 干杯!


#12楼

这是我的首选解决方案:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

#13楼

我只是遇到了类似情况。 我不想使用JQuery,而是想使用纯Javascript做到这一点。

我所做的就是使用以下条件,它对我有用。

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty//Code here..
}

对于不等于,请使用以下命令: JSON.stringify(obj) !== '{}'

看看这个JSFiddle


#14楼

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


#15楼

另一种选择是使用is.js (14kB),而不是jquery (32kB), lodash (50kB)或下划线 (16.4kB)。 在上述库中,is.js被证明是最快的库,可用于确定对象是否为空。

http://jsperf.com/check-empty-object-using-libraries

显然,所有这些库都不完全相同,因此,如果您需要轻松地操作DOM,则jquery可能仍然是一个不错的选择,或者,如果您需要的不仅仅是类型检查,那么lodash或下划线可能会很好。 至于is.js ,语法如下:

var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false

就像下划线和lodash的_.isObject() ,这不仅适用于objects而且适用于arraysstrings

引擎盖下这个库是用Object.getOwnPropertyNames它类似于Object.keysObject.getOwnPropertyNames是更彻底的,因为所描述的,将返回可枚举和不可枚举的属性在这里 。

is.empty = function(value) {if(is.object(value)){var num = Object.getOwnPropertyNames(value).length;if(num === 0 || (num === 1 && is.array(value)) || (num === 2 && is.arguments(value))){return true;}return false;} else {return value === '';}
};

如果您不想引入一个库(这是可以理解的),并且知道只检查对象(而不是数组或字符串),那么以下函数应该适合您的需求。

function isEmptyObject( obj ) {return Object.getOwnPropertyNames(obj).length === 0;
}

这仅比is.js快一点,尽管只是因为您没有检查它是否是对象。


#16楼

ECMA 7+ :

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

ECMA 5+ :

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

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

下划线 :

_.isEmpty({}); // true

ek

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS(版本1)

angular.equals({}, {}); // true

拉姆达

R.isEmpty({}); // true

#17楼

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

经过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;
}

有关详细的测试结果和测试代码,请参见对象是否为空?


#18楼

我发现的最好方法:

function isEmpty(obj)
{if (!obj){return true;}if (!(typeof(obj) === 'number') && !Object.keys(obj).length){return true;}return false;
}

效劳于:

    t1: {} -> truet2: {0:1} -: falset3: [] -> truet4: [2] -> falset5: null -> truet6: undefined -> truet7: "" -> truet8: "a" -> falset9: 0 -> truet10: 1 -> false

#19楼

下面的示例演示如何测试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 

#20楼

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

if (Object.keys(a).length > 0) {// not empty
}

#21楼

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

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

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


#22楼

正确答案是:

const isEmptyObject = obj =>Object.getOwnPropertyNames(obj).length === 0 &&Object.getOwnPropertySymbols(obj).length === 0 &&Object.getPrototypeOf(obj) === Object.prototype;

这将检查:

  • 该对象没有自己的属性(无论可枚举性如何)。
  • 该对象没有自己的属性符号。
  • 对象的原型正是Object.prototype

换句话说,该对象与用{}创建的对象是无法区分的。


#23楼

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

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])

#24楼

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

Object.entries({}).length === 0

#25楼

您可以使用Underscore.js 。

_.isEmpty({}); // true

#26楼

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

#27楼

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

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;
}

#28楼

  1. 只是一种解决方法。 如果没有数据,您的服务器能否生成一些特殊属性?

    例如:

     var a = {empty:true}; 

    然后,您可以轻松地在AJAX回调代码中对其进行检查。

  2. 另一种检查方法:

     if (a.toSource() === "({})") // then 'a' is empty 

编辑 :如果您使用任何JSON库(fe JSON.js),则可以尝试JSON.encode()函数并针对空值字符串测试结果。


#29楼

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

#30楼

我的看法:

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()

如何测试一个空的JavaScript对象?相关推荐

  1. C# CLR 聊聊对象的内存布局 一个空对象占用多少内存

    在 C# 中的对象大概可以分为三个不同的类型,包括值类型.引用类型和其他类型.本文主要讨论的是引用类型对内存空间的占用情况.在讨论开始之前我想问问大家,一个空的对象会占用多少内存空间?当然这个问题本身 ...

  2. 如何遍历或枚举JavaScript对象?

    我有一个如下的JavaScript对象: var p = {"p1": "value1","p2": "value2", ...

  3. halcon学习易错系列—创建空的object对象算子gen_empty_obj

    概述 halcon引擎方式存在一个bug,今天用了半天的时间发现了这个无厘头的bug,记录下来,以防这种情况再坑人,同时警示大家在学习商业库时,也不能丢掉开源库 建议 1.针对引擎调用hdvp方法时, ...

  4. javascript对象包含哪些要素_让人迷糊的JavaScript对象(Object一)

    对于很多初学的小伙伴听到JavaScript内置对象.BOM.DOM.WEB API等关键词基本上都是迷糊,不是很明白他们之间的关系,以及他们是如果建立联系的.虽然我们现在小伙伴在学VUE,React ...

  5. 测试嵌套JavaScript对象键的存在

    如果我有一个对象的引用: var test = {}; 可能(但不是立即)具有嵌套对象,例如: {level1: {level2: {level3: "level3"}}}; 检查 ...

  6. html 表单内容怎么获取不到,jquery中formdate一直获取不到对象中的[0]的值 包括本身也是一个空的数据怎么办?...

    jquery中formdate一直获取不到对象中的[0]的值 包括本身也是一个空的数据怎么办? 再做一个前台的ajax方法 查网上用formdate方法上传.可是进了接口之后一直在控制台获取不到for ...

  7. 判断JavaScript对象为null或者属性为空

    http://blog.csdn.net/yiluoak_47/article/details/7766760 首先说下null与undefined区别: 对已声明但未初始化的和未声明的变量执行typ ...

  8. php 怎么定义一个空对象,php定义空对象的方法

    本文主要和大家分享php定义空对象的方法,有时候我们直接对不存在的数组直接定义其下标的值,不会报错,但是我们定义不存在的对象的时候,就会报错,这个时候我们定义一个空对象即可.有以下三种方法:<? ...

  9. 画一个小汽车来展示JavaScript对象操作

    本文通过画一个小汽车来展示JavaScript的对象操作 代码如下: <html> <head> <title>JavaScript对象</title> ...

最新文章

  1. R语言str_sub函数从字符串中提取或替换子字符串(substring):str_sub函数指定起始位置和终止位置抽取子字符、str_sub函数指定起始位置和终止位置替换子字符串
  2. pythonselenium浮动框_python上selenium的弹框操作实现
  3. boost::advance用法的测试程序
  4. Mongo数据库搭建
  5. 热图绘制一个快乐五一
  6. java中解决request中文乱码问题
  7. [msi]启动msi日志记录
  8. 土人系列AS入门教程--对象篇
  9. Django - 请求与响应、表单、中间件、上下文处理器
  10. python入门11 元组tuple
  11. 3DMax导出FBX文件贴图丢失
  12. java 轻量 mq_uncode-mq
  13. 【笔记】【数字逻辑】可能是最详细的二进制、八进制、十进制、十六进制进制转换笔记
  14. 基于物联网的室内环境监测系统设计的背景
  15. 三菱M80操作介绍_CIMT2019 展品预览:三菱电机以“智能制造 价值创造”为主题参展...
  16. 如何用matlab画出正螺面,matlab中的螺旋网格
  17. Linux du按大小排序
  18. android 静态工厂方法,Android 源码中的静态工厂方法
  19. 智慧物联网的运用领域
  20. 快速获取当天0点0分0秒(00:00:00),23点59分59秒(23:59:59)

热门文章

  1. iOS架构-静态库.a的打包及使用(2)
  2. php接口性能测试工具,PHP 应用性能优化指南
  3. android 获取快捷开关_适合收藏丨3dmax快捷键命令大全
  4. elastichd安装部署
  5. JSON Path表达式
  6. LeetCode(72):编辑距离
  7. oracle建表权限问题和JSP连接oracle数据库基本操作
  8. 转 使用DCloud+Framework7制作移动APP应用
  9. 怎样用HTML5 Canvas制作一个简单的游戏
  10. 实时数据库领域中有关数据压缩的认识误区