javascript 中有 string, number, boolean, undefined, null 这 5 种基本类型 和 引用类型 object
其中 null 表示一个值被定义了,定义为“空值”;而 undefined 表示根本不存在定义(缺少值)。
所以设置一个值为 null 是合理的,如 obj.value = null;
但设置一个值是 undefined 是不合理的,undefined 典型用法是,请参阅
由此引发 “前后端接口定义的默认值问题”
// java 对应的数据类型的默认值(空值)对应都是 null
string => null
number => null
boolean => null
date => null
object => null
array => null
如果后端直接抛给前端这些个 null,经过表单编辑后的数据如下
server => string => null => el-input => '' => server
server => number => null => el-input => '' => server
server => boolean => null => el-switch => false => server
server => date => null => el-date => 时间戳 => server
server => object => null => {} => {} => server
server => array => null => [] => [] => server
再加载页面,后端把数据传给前端
server => string => '' => el-input => '' => server
server => number => '' => el-input => '' => server
server => boolean => false => el-switch => false => server
server => date => 时间戳 => el-date => 时间戳 => server
server => object => null => {} => {} => server
server => array => null => [] => [] => server
这里有争议点在于,字符串 string, 数字 number, 和布尔 boolean 类型
用户一旦经过下列交互,null(空值)即被改变
字符 null => ‘abc’ => ‘’ [交互导致]
数字 null => ‘123’ => ‘’ [交互导致]
布尔 null => false => false [组件行为]
所以,关于 这 三个类型,一旦后端 api 赋予 null 表达业务逻辑,如:表示空值 前端同学在保存数据时就要小心处理,如
字符 null => ‘abc’ => ‘’ [交互导致] => 转换回 null => server
数字 null => ‘123’ => ‘’ [交互导致] => 转换回 null => server
布尔 null => false => false [组件行为] => 转换回 null => server
其中 布尔 的处理比较特殊,即使用户没交互,组件初始化时就把它改变了,需要根据情况特殊处理
当然,如果约定 布尔 的默认值是 false,完全可以规避这个问题了
布尔 false => false => true => server
另外,关于 objec 和 array 建议定义为空对象{} 和 空数组[], 避免不必要的错误, 注意是任何深度的数组和集合的数据都要
data() {
return {
obj: {
string : null
number : null
boolean : null ?=> false
date : null
object : {}
array : [],
deepData: { object: {}, array: [] }
}
}
}