在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
当前回答
我真不敢相信,经过两年的js编程,它从来没有点击过空对象和数组都不是假的,最奇怪的是它从来没有让我发现。
如果默认情况下输入为false,或者输入为空对象或数组,则返回true。逆函数是真正的函数
http://codepen.io/synthet1c/pen/pjmoWL
function falsish( obj ){
if( (typeof obj === 'number' && obj > 0) || obj === true ){
return false;
}
return !!obj
? !Object.keys( obj ).length
: true;
}
function trueish( obj ){
return !falsish( obj );
}
falsish({}) //=> true
falsish({foo:'bar'}) //=> false
falsish([]) //=> true
falsish(['foo']) //=> false
falsish(false) //=> true
falsish(true) //=> false
// the rest are on codepen
其他回答
警告当心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 {}
我很喜欢我想出的这个,在这里的一些其他答案的帮助下。我想我会分享。
Object.defineProperty(Object.prototype,'isEmpty'{获取(){for(此处为var p){if(this.hasOwnProperty(p)){return false}}返回true;}});让用户={};让颜色={primary:“红色”};让大小={sm:100,md:200,lg:300};控制台日志('\nusers=',用户,'\nusers.isEmpty==>'+users.isEmpty,“\n\n--------------\n”,'\ncolors=',颜色,'\ncolors.isEmpty==>'+colors.isEmpty,“\n\n--------------\n”,'\nsizes=',大小,'\nsizes.isEmpty==>'+sizes.isEmpty,“\n”,'');
正确答案是:
function isEmptyObject(obj) {
return (
Object.getPrototypeOf(obj) === Object.prototype &&
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0
);
}
这将检查:
对象的原型完全是object.prototype。该对象没有自己的财产(无论可枚举性如何)。对象没有自己的属性符号。
换句话说,该对象与使用{}创建的对象无法区分。
我知道这并不能100%回答你的问题,但我以前也遇到过类似的问题,下面是我如何解决这些问题:
我有一个可能返回空对象的API。因为我知道从API中需要哪些字段,所以我只检查是否存在任何必需的字段。
例如:
API返回{}或{agentID:“1234”(必需),地址:“1234通道”(可选),…}。在我的调用函数中,我只检查
if(response.data && response.data.agentID) {
do something with my agentID
} else {
is empty response
}
这样,我就不需要使用那些昂贵的方法来检查对象是否为空。如果对象没有agentID字段,则调用函数的对象将为空。
export function isObjectEmpty(obj) {
return (
Object.keys(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
obj.constructor === Object
);
}
这包括检查包含符号财产的对象。
Object.keys不检索符号财产。