在日常开发中,
undefined
一般代表未声明或未初始化,可以说是一个无效值, 会引起不必要的代码报错。数据值不存在时,可以返回空字符串或者null
但因目前大部分定义接口时都不够规范,返回值也是多种多样,在规范得不到很好落实的时候,就需要双方做好容错处理,所以深入学习了JSON.stringify
JSON.stringify()的基础用法
-
语法:
JSON.stringify(value[, replacer[, space]])
-
说明:将对象 \ 值转换为字符串
指定replacer
为函数 => 选择性的替换
指定replacer
为数组 => 转换指定的(数组中包含的)属性 -
基本功能使用
code
:
// 指定replacer为函数, 当返回值中undefined需要处理时可以使用该方法
JSON.stringify({"name": "emoji", age: undefined, sex: "girl"}, (key, value)=> {
return typeof value === 'undefined' ? '' : value
});
{"name":"emoji","age":"","sex":"girl"}
// 指定replacer为数组,只过滤数组包含的属性
JSON.stringify({"name": "emoji", age: undefined, sex: "girl"}, ['name', 'sex']);
{"name":"emoji","sex":"girl"}
// 指定space美化输出
JSON.stringify({"name": "emoji", age: undefined, sex: "girl"}, ['name', 'sex'], 2);
{
"name": "emoji",
"sex": "girl"
}
特性:
关于包含undefined、任意的函数、symbol值
-
undefined
、任意的函数、symbol
值,出现在非数组对象的属性值中时,在序列化过程中会被忽略
// 对象中存在会被忽略
let signInfo = [{fieldId: 539, value: undefined},{fieldId: 540, value: 'emoji'}];
JSON.stringify(signInfo); // [{"fieldId":539},{"fieldId":540,"value":"emoji"}]
-
undefined
、任意的函数以及symbol
值出现在数组中时会被转换成null
&NaN
和Infinity
格式的数值及null
都会被当做null
// 数组中存在会被转为null
let signInfo = [{fieldId: 539, value: undefined},{fieldId: 540, value: 'emoji'}, Symbol('emoji'), function showName(){console.log("emoji");}]
JSON.stringify(signInfo); //[{"fieldId":539},{"fieldId":540,"value":"emoji"},null,null]
-
undefined
、任意的函数以及symbol
值被单独转换时,会返回undefined
// 单独转换返回undefined
JSON.stringify(undefined); // undefined
JSON.stringify(()=>{return "a"}); // undefined
JSON.stringify(Symbol("emoji")); // undefined
关于包含boolean、数字、字符串
1、布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
原生包装对象 Number、String、Boolean
JSON.stringify([new Number(1), new String("emoji"), new Boolean(false)]) // [1,"emoji",false]
其他
4、其他类型对象,如Map\Set
,仅会序列化可枚举的属性
5、当尝试去转换BigInt
类型的值会抛出错误
6、转换值如果有toJSON()
方法,该方法定义什么值将被序列化
const toJSONObj = {
name: 'emoji',
toJSON () {
return 'JSON.stringify'
}
}
JSON.stringify(toJSONObj) // "JSON.stringify"
手写stringify
TODO