• JSON.stringify 方法模拟


    先严格判断类型:

    function getType(vari) {
      return Object.prototype.toString.call(vari).slice(8, -1)
    }

    然后处理各种类型的数据:

    function toStringify(obj) {
      let str = ''
      switch (getType(obj)) {
        case 'Object': // 对象类型需要遍历递归
          str += '{'
          Object.keys(obj).forEach(k => {
            let res = toStringify(obj[k])
            if (res) {
              str += `"${k}":${res},`
            }
          })
          return str.slice(0, -1) + '}'
        case 'Array': // 数组类型需要遍历递归
          str = '['
          obj.forEach(k => {
            let res = toStringify(k)
            if (res) {
              str += res + ','
            }
          })
          return str.slice(0, -1) + ']'
        case 'Date': // 日期类型需要toJSON转日期字符串
          return `"${obj.toJSON()}"`
        case 'String': // 字符串需要加引号
          return `"${obj}"`
        case 'Number': // 数字类型直接返回
          return `${obj}`
        case 'Boolean': // 布尔类型true和false转字符串
          if (obj === true) {
            return `true`
          }
          return `false`
        case 'RegExp': // 以下类型直接转空对象字符串
        case 'Set':
        case 'Map':
        case 'WeakMap':
        case 'WeakSet':
        case 'ArrayBuffer':
        case 'Blob':
        case 'Int32Array':
        case 'Int8Array':
        case 'Int16Array':
          return `{}`
        case 'Null': // null转字符串
          return `null`
        case 'BigInt': // bigint类型报错
          throw Error('Do not know how to serialize a BigInt')
          return
        case 'Function': // 以下三个及其它类型返回空忽略
        case 'Undefined':
        case 'Symbol':
        default:
          return
      }
    }

    其实很简单,只需要判断类型,该转什么就转什么,然后拼接,上面只罗列了21种类型,如果还有其它的加上就行

    每一次的记录,都是向前迈进的一步
  • 相关阅读:
    误删表空间处理办法
    一步步开发网站系列-网站界面
    webstorm ftp发布问题
    TP5接受Vue跨域请求
    tp5上传图片添加永久素材到微信公众号
    将博客搬至CSDN
    swoole http_server 多进程并使用多进程处理消息
    高并发下,php与redis实现的抢购、秒杀功能
    SVN服务器搭建
    web服务器安全笔记
  • 原文地址:https://www.cnblogs.com/kdcg/p/14583657.html
Copyright © 2020-2023  润新知