今日处理时突然意识到一个问题:前后端对于空值的理解不一样,导致后端返回空值后前端显示了:
- 前端认为空字符串
''是空值,空字符串中带空格' '是有值的 - 后端认为这些都是空值
查了下,后端使用StringUtils.isBlank方法判空,其中的null、''、' '、'\n\t\r'等都是空值。由于之前被Boolean(0) === false坑过,被解构赋值坑过(只有当属性值为undefined时,才会给默认值),因此写一个自己的判空函数
// js数据类型
// null undefined
// number 0
// string ' '
// object {}
const isBlank = (value)=>{
if(value === undefined || value === null){
return true;
}
if(value === 0){
return false
}
if(typeof value === 'string'){
return !value.trim().length
}
if(typeof value == Boolean){
return false;
}
if(typeof value === 'object' ){
return Object.keys(value).length < 1
}
return !value;
}
let testData = [undefined, null, 0, '0', '', ' ', '\n', {a: 1}, {} ]
// let testData = [ 0, '0', '', ' ', '\n']
// console.log(isBlank(null))
testData.map(item=>{
console.log(item, isBlank(item), typeof item)
})
注意点:
- Boolean(0) == false
- 空字符串为false
- 默认状态下
' '为true - Boolean(false) == false
- object 通过属性值方式进行判断,Object。keys只查询该对象自身属性,不查询原型链属性