最近有一个需求,需要判断调用接口返回值是否为空。结果返回的如果是个空对象,判断的时候为true,目标结果应该是返回false。以下为解决方法和注意事项。
注意:JavaScript中的数据类型自动转换时,空数组或空对象都的布尔类型不是false,而是【true】
JavaScript自动转换为布尔值【非常重要,和Python有很大的区别】
当JavaScript遇到预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用Boolean函数。
因此除了以下六个值,其他都是自动转为true**【空数组[]和空对象{}的布尔类型都是true】**
undefinednull-00或+0NaN''(空字符串)
所以这里会有问题 res?ture:false //始终返回true
console.log(Boolean([])); // true
console.log(Boolean({})); // true
//判断是否有备份配置
_autoBackupList().then(res => {
const isHasConfig = res?ture:false //始终返回true
setHasConfig(isHasConfig) //判断是否有配置
setConfigObj(res) //获取配置信息 })
解决方法
1、for in 循环判断
var obj = {};
var b = function() {
for(var key in obj) {
return false;
}
return true;
}
2、ES6的写法
var data = {};
var arr = Object.keys(data);
console.log(arr.length == 0);//true
3、jQ的写法
var data = {};
var b = $.isEmptyObject(data);
我用的第二种方法
//判断是否有备份配置
_autoBackupList().then(res => {
const hasConfig = Object.keys(res) //是个数组
setHasConfig(!!hasConfig[0]) //判断是否有配置
setConfigObj(res) //获取配置信息
})
空数组判断
arr.length===0 //true
以上。在写代码的时候,对象和数组,先判断一下,存在再进行下一步处理,如
const cloud = vmData.length !=== 0&&vmData.cloud
避免由于没有数据导致的报错。
如果有更好的方法,欢迎分享讨论!