在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我该如何检查是否是这种情况?
当前回答
我很喜欢我想出的这个,在这里的一些其他答案的帮助下。我想我会分享。
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() {
return toString.call(obj) === "[object Object]"
&& Object.keys(obj).length === 0;
}
或ES6/7
const isEmptyObject = () => toString.call(obj) === "[object Object]"
&& Object.keys(obj).length === 0;
使用这种方法,如果obj设置为undefined或null,则代码不会中断。并返回null。
我真不敢相信,经过两年的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
这与在lodash源中检查对象的方式类似:
const isEmpty = value => {
for (const key in value) {
if (hasOwnProperty.call(value, key)) {
return false
}
}
return true;
}
但有很多其他方法可以做到这一点。
如果ECMAScript 5支持可用,则可以使用Object.keys():
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
对于ES3和更高版本,没有简单的方法可以做到这一点。您必须显式循环财产:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
任何类型的值都为空
/* eslint-disable no-nested-ternary */
const isEmpty = value => {
switch (typeof value) {
case 'undefined':
return true;
case 'object':
return value === null
? true
: Array.isArray(value)
? !value.length
: Object.entries(value).length === 0 && value.constructor === Object;
case 'string':
return !value.length;
default:
return false;
}
};