• 手写JSON.stringify


    // string -> string  `"${string}"`
    // number -> `${number}`
    // bigInt -> throw new Error('Do not know how to serialize a BigInt at JSON.stringify');
    // infinity -> null
    // -infinity-> null
    // boolean -> `${boolean}`
    // undefined -> undefined null
    // null -> null
    // symbol  -> undefined
    // function -> undefined
    // date  Fri Sep 10 2021 11:05:07 GMT+0800 (中国标准时间) -> `${date.toISOString()}` ""2021-09-10T03:04:48.870Z""
    // regExp -> "{}"
    // error -> "{}"
    // array ->
    // object->
    function isType(data, type) {
      const typeStr = Object.prototype.toString.call(data);
      const reg = /s([A-z]+)]/g;
      const matchs = reg.exec(typeStr);
      return matchs[1].toLowerCase() === type.toLowerCase();
    }
    function stringify(data) {
      if(isType(data, "bigInt")) { // 报错的数据类型
        throw new Error('Do not know how to serialize a BigInt at JSON.stringify');
      }
    
      const nullTypes = ["undefined", "infinity", "-infinity", "null"]
      if(nullTypes.some(v => isType(data,v))) { // 返回null的数据类型
        return "null"
      }
      if(data !== data) {
        return 'null';
      }
      const undefinedTypes = [ "symbol", "function"]
      if(undefinedTypes.some(v => isType(data,v))) { // 返回undefined的数据类型
        return "undefined"
      }
      const originalTypes = ["number", "boolean"]
      if(originalTypes.some(v => isType(data,v))) { // 返回原数据的数据类型
        return `${data}`
      }
      if(isType(data, "string")) { // 处理 string
        return `"${data}"`
      }
      const emptyObjTypes = ["regexp", "error"]
      if(emptyObjTypes.some(v => isType(data,v))) { // 返回{}的数据类型
        return `{}`
      }
      if(isType(data, "date")) { // 处理date
        return `${data.toISOString()}`;
      }
      if (Array.isArray(data)) {  // 处理数组
        const arr = data.map(v => stringify(v));
        return `[${arr.join(",")}]`
      }
      if(isType(data,"object")) { // 处理对象
        const arr = Object.entries(data).reduce((cur, [key, value]) => {
          if(value === undefined) { return cur};
          cur.push(`"${key}":${stringify(value)}`);
          return cur;
        }, [])
        return `{${arr.join(",")}}`;
      }
    }
    

      

  • 相关阅读:
    最高效的无限级菜单生成方法
    MySQL性能优化的最佳20+条经验(转)
    Web应用中的轻量级消息队列
    Delphi Setlength 内存释放总结
    Delphi 的TSpeedButton按下和弹起效果
    Delphi存取图像完整解决方案
    delphi 开机自动运行代码
    有关时间限制使用和软件注册的设计(delphi)
    Linux环境thinkphp配置以及数据源驱动改动
    Dalvik和ART简单介绍
  • 原文地址:https://www.cnblogs.com/ygunoil/p/15250763.html
Copyright © 2020-2023  润新知