使用场景
场景1
请求接口返回的数据是数组类型,没有数据时,后端竟然返回null(坑),而不是空数组,导致判断数据是否为空报错 console.log(!arr.length) ==> Uncaught TypeError: Cannot read properties of null (reading 'length')
场景2
由于js是弱类型语言,一开始声明变量是数组,进过一系列的赋值操作后,由于代码不规范,变量可能变成了undefined、null或其他数据类型,这时通过!arr.length
判断也会报错
场景3
判断数值类型是否为空,0转成布尔值为false,这明显就不对了
场景4
判断对象类型是否为空,每次都得手写,太麻烦
// 检查字符串是否为空
const checkStringEmpty = (str) => {
return !str
}
// 检查数值是否为空
const checkNumberEmpty = (num) => {
return !num.toString()
}
// 检查对象是否为空
const checkObjectEmpty = (obj) => {
return Object.keys(obj).length === 0
}
// 检查数组是否为空
const checkArrayEmpty = (arr) => {
return arr.length === 0
}
// 各数据类型检查方法字典
const checkDataEmptyDict = {
string: checkStringEmpty,
number: checkNumberEmpty,
Object: checkObjectEmpty,
Array: checkArrayEmpty,
function: () => false,
undefined: () => true,
boolean: (data) => !data,
Null: () => true
}
/**
* @description 检查数据是否为空,为空返回true,不为空返回false
* @param {any} data
* @return {Boolean}
* @example isEmpty({}) ⇒ true
*/
const isEmpty = (data) => {
let type = typeof(data)
// 基础数据类型
if (type !== 'object') return checkDataEmptyDict[type](data)
// 引用数据类型
type = Object.prototype.toString.call(data).replace(/^\[object (\S+)\]$/,'$1')
return checkDataEmptyDict[type](data)
}
// 使用
let data = {}
if (isEmpty(data)) {
console.log('data为空!')
} else {
console.log('data值为:', data)
}