},
]
let newSignInfo = signInfo.map((it) => {
const value = https://www.isolves.com/it/cxkf/bk/2022-11-07/typeof it.value === 'undefined' ? '' : it.value
return {
...it,
value
}
})
console.log(JSON.stringify(newSignInfo))
// '[{"fieldId":539,"value":""},{"fieldId":540,"value":""},{"fieldId":546,"value":""}]'
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A422DB-2.png)
文章插图
如果发现某个字段的值为undefined , 我们将该字段的值更改为空字符串 。
虽然问题已经解决了 , 但是 , 我们还需要思考这个问题是怎么产生的 。
本来这是一个已经上线好几天的页面 , 为什么突然出现这个问题?仔细排查 , 原来是产品经理之前提出了一个小的优化点 , 然后 , 胖头对代码做了一点改动 。但是胖头对 JSON.stringify 的特性并不熟悉 , 同时 , 他认为改动比较小 , 所以没有进行足够的测试 , 最终导致项目出现 bug 。
好在他发现问题后 , 很快就解决了问题 。这个bug影响的用户少 , 所以老板没有责怪他 , 我的朋友奖金没有丢掉 , 不然 , 影响大的话 , 估计奖金真的就没有了 , 甚至还会让他直接离开 。
接着 , 我们一起来了解一下 JSON.stringify , 它为啥那么“厉害” , 差点把我朋友的奖金都给弄丢了 。
了解一下 JSON.stringify
其实 , 这个bug主要是因为胖头对JSON.stringify不熟悉造成的 , 所以 , 这里我们就一起来分析一下这个内置函数的一些特点 。
基本上 , JSON.stringify() 方法将 JAVAScript 对象或值转换为 JSON 字符串:
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A4223556-8.png)
文章插图
同时 , JSON.stringify 有以下规则 。
1、如果目标对象有toJSON()方法 , 它负责定义哪些数据将被序列化 。
![我的朋友因为 JSON.stringify 差点丢了奖金](https://www.isolves.com/d/file/p/2022/11-07/d99f207068ea9b317413a7ec633483e9.png)
文章插图
2、 Boolean、Number、String 对象在字符串化过程中被转换为对应的原始值 , 符合传统的转换语义 。
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A4221046-10.png)
文章插图
3、 undefined、Functions 和 Symbols 不是有效的 JSON 值 。如果在转换过程中遇到任何此类值 , 则它们要么被忽略(在对象中找到) , 要么被更改为 null(当在数组中找到时) 。
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A42264K-11.png)
文章插图
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A422D42-12.png)
文章插图
4、 所有 Symbol-keyed 属性将被完全忽略
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A4222W6-13.png)
文章插图
5、 Date的实例通过返回一个字符串来实现toJSON()函数(与date.toISOString()相同) 。因此 , 它们被视为字符串 。
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A4223158-14.png)
文章插图
6、 数字 Infinity 和 NaN 以及 null 值都被认为是 null 。
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A4223S0-15.png)
文章插图
7、 所有其他 Object 实例(包括 Map、Set、WeakMap 和 WeakSet)将仅序列化其可枚举的属性 。
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A4224502-16.png)
文章插图
8、找到循环引用时抛出TypeError(“循环对象值”)异常 。
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A4222548-17.png)
文章插图
9、 尝试对 BigInt 值进行字符串化时抛出 TypeError(“BigInt 值无法在 JSON 中序列化”) 。
![我的朋友因为 JSON.stringify 差点丢了奖金](http://img.jiangsulong.com/221108/1A4225211-18.png)
文章插图
自己实现 JSON.stringify
理解一个函数的最好方法是自己实现它 。下面我写了一个模拟 JSON.stringify 的简单函数 。
const jsonstringify = (data) => {
// Check if an object has a circular reference
const isCyclic = (obj) => {
// Use a Set to store the detected objects
let stackSet = new Set()
推荐阅读
- 谢谢你医生|看了八集《谢谢你医生》,发现演技不能比较,因为优与劣一目了然
- 陈佩斯|为何很多人对陈佩斯的评价高于赵本山?是因为人品的原因吗?
- 董卓是因为貂蝉死的吗,杀了董卓之后貂蝉去哪里了-
- 张嘉益|金鹰奖失礼一幕:张嘉译最尴尬,因为没参加颁奖,所以不配推荐?
- 13种生发中药
- 运动减肥怎么喝水?
- 秦国这么强大到底因为什么灭,秦国这么强大为什么会被灭-
- 郭晶晶|霍启刚:郭晶晶比赛我最紧张,因为跟我恋爱错失冠军,我要被骂死
- 刘涛|41岁刘涛当众表演倒立,因为衣服不对劲,不小心......
- 血橙怎么吃