我的朋友因为 JSON.stringify 差点丢了奖金( 二 )

  • },
  • ]
  • 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 差点丢了奖金

    文章插图
    如果发现某个字段的值为undefined , 我们将该字段的值更改为空字符串 。
    虽然问题已经解决了 , 但是 , 我们还需要思考这个问题是怎么产生的 。
    本来这是一个已经上线好几天的页面 , 为什么突然出现这个问题?仔细排查 , 原来是产品经理之前提出了一个小的优化点 , 然后 , 胖头对代码做了一点改动 。但是胖头对 JSON.stringify 的特性并不熟悉 , 同时 , 他认为改动比较小 , 所以没有进行足够的测试 , 最终导致项目出现 bug 。
    好在他发现问题后 , 很快就解决了问题 。这个bug影响的用户少 , 所以老板没有责怪他 , 我的朋友奖金没有丢掉 , 不然 , 影响大的话 , 估计奖金真的就没有了 , 甚至还会让他直接离开 。
    接着 , 我们一起来了解一下 JSON.stringify , 它为啥那么“厉害” , 差点把我朋友的奖金都给弄丢了 。
    了解一下 JSON.stringify
    其实 , 这个bug主要是因为胖头对JSON.stringify不熟悉造成的 , 所以 , 这里我们就一起来分析一下这个内置函数的一些特点 。
    基本上 , JSON.stringify() 方法将 JAVAScript 对象或值转换为 JSON 字符串:
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    同时 , JSON.stringify 有以下规则 。
    1、如果目标对象有toJSON()方法 , 它负责定义哪些数据将被序列化 。
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    2、 Boolean、Number、String 对象在字符串化过程中被转换为对应的原始值 , 符合传统的转换语义 。
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    3、 undefined、Functions 和 Symbols 不是有效的 JSON 值 。如果在转换过程中遇到任何此类值 , 则它们要么被忽略(在对象中找到) , 要么被更改为 null(当在数组中找到时) 。
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图

    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    4、 所有 Symbol-keyed 属性将被完全忽略
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    5、 Date的实例通过返回一个字符串来实现toJSON()函数(与date.toISOString()相同) 。因此 , 它们被视为字符串 。
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    6、 数字 Infinity 和 NaN 以及 null 值都被认为是 null 。
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    7、 所有其他 Object 实例(包括 Map、Set、WeakMap 和 WeakSet)将仅序列化其可枚举的属性 。
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    8、找到循环引用时抛出TypeError(“循环对象值”)异常 。
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    9、 尝试对 BigInt 值进行字符串化时抛出 TypeError(“BigInt 值无法在 JSON 中序列化”) 。
    我的朋友因为 JSON.stringify 差点丢了奖金

    文章插图
    自己实现 JSON.stringify
    理解一个函数的最好方法是自己实现它 。下面我写了一个模拟 JSON.stringify 的简单函数 。
     
    1. const jsonstringify = (data) => {
    2. // Check if an object has a circular reference
    3. const isCyclic = (obj) => {
    4. // Use a Set to store the detected objects
    5. let stackSet = new Set()


      推荐阅读