美文网首页
JSON.stringify()实现Function的拷贝

JSON.stringify()实现Function的拷贝

作者: jia林 | 来源:发表于2021-11-30 23:06 被阅读0次

前言:对于简单的数据结构而言,我们经常使用JSON.parse()、JSON.stringify()进行拷贝,但它无法实现Function类型的拷贝,我们可以使用JSON.stringify()的可选参数实现

概念

语法

JSON.stringify(value[, replacer [, space]])

参数

  • 【value】 将要序列化成 一个 JSON 字符串的值。
  • 【replacer 可选】如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为 null 或者未提供,则对象所有的属性都会被序列化。
  • 【space 可选】指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(当字符串长度超过10个字母,取其前10个字母),该字符串将被作为空格;如果该参数没有提供(或者为 null),将没有空格。

代码实现

const parser = {
    FUNC_PREFIX: "__customFunc__",
    isArrOrObj: function (obj) {
      return !!obj && typeof obj === "object";
    },
    funcParse: function (obj) {
      let result = obj.constructor === Array ? [] : {};
      if (obj.constructor === Array) {
        result = obj.map((v) => {
          /** 如果是函数类型, 则转换为字符串 */
          if (typeof v === "function") {
            return `${this.FUNC_PREFIX}${v}`;
          }
          /** 如果是数组或者对象 */
          if (this.isArrOrObj(v)) {
            return this.funcParse(v);
          }
          /** 基本类型 */
          return v;
        });
      }

      if (obj.constructor === Object) {
        for (let key in obj) {
          const v = obj[key];
          if (typeof v === "function") {
            result[key] = `${this.FUNC_PREFIX}${v}`;
          } else if (this.isArrOrObj(v)) {
            result[key] = this.funcParse(v);
          } else {
            result[key] = v;
          }
        }
      }

      return result
    },

    parse:function(jsonStr,error=new Error) {
      try {
        return JSON.parse(jsonStr,(key,value)=>{
          if(value && typeof value === 'string') {
            return value.indexOf(this.FUNC_PREFIX) > -1 ? new Function(`return ${value.replace(this.FUNC_PREFIX,'')}`)():value
          }
          return value
        })
      }catch(err) {
        error && error(err)
      }
    },
    stringify:function(obj,replacer=null,space=null,error = new Error){
      try{
        let _obj = obj
        if(this.isArrOrObj(obj)) {
          _obj = this.funcParse(obj)
        }
        if(typeof obj === 'function') {
          _obj = `${this.FUNC_PREFIX}${obj}`
        }
        return JSON.stringify(_obj,replacer,space)
      }catch(err) {
        error && error(err)
      }
    },
    fastStringify:function(obj,space=null,error=new Error) {
      try {
        return JSON.stringify(obj,(key,value)=>{
          if(typeof value === 'function') {
            return `${this.FUNC_PREFIX}${value}`
          }
          return value
        },space)
      }catch(err) {
        error && error(err)
      }
    }
  };

相关文章

网友评论

      本文标题:JSON.stringify()实现Function的拷贝

      本文链接:https://www.haomeiwen.com/subject/guyjxrtx.html