JS模拟 JSON.stringify 的基础功能实现

测试数据:

复制代码
// 测试 stringify 函数(将对象转换为JSON格式的字符串)
var obj = {
  a: 1,
  b: {
    c: 'hello',
    d: {
      e: [1,2,{x: 0}],
      f: function() {},
      g: false,
    }
  },
  h: null,
  j: undefined,
  m: new Map([[1, 2]]),
};
复制代码

 

模拟实现:

复制代码
/**
 * 模拟 JSON.stringify
 */
var stringify = function (data) {
  const type = typeOf(data);
  let str = '';
  switch (type) {
    case 'object':
      const keys = Object.keys(data);
      const size = keys.length;
      str += '{';
      for (let i = 0; i < size; i++) {
        const key = keys[i];
        const value = stringify(data[key]);
        if (value === undefined) continue;
        str += key + ':' + value;
        if (i < size - 1) str += ',';
      }
      str += '}';
      return str;
    case 'array':
      const len = data.length;
      str += '[';
      for (let i = 0; i < len; i++) {
        const value = stringify(data[i]);
        if (value === undefined) continue;
        str += value;
        if (i < len - 1) str += ',';
      }
      str += ']';
      return str;
    case 'string':
      return `"${data}"`;
    case 'number':
      return '' + data;
    case 'boolean': 
      return data ? 'true' : 'false';
    case 'null':
      return 'null';
    case 'undefined':
    case 'function':
    case 'symbol':
      return;
    case 'map':
    case 'set':
    case 'weakmap':
    case 'weakset': 
    case 'regexp':
    case 'arraybuffer':
    case 'blob':
    case 'int8array':
    case 'int16array':
    case 'int32array':
      return '{}';
    case 'bigint':
      throw new TypeError('Do not know how to serialize a BigInt');
    default: 
      return;
  }
};

/**
 * 判断获取数据的类型
 */
var typeOf = function (o) {
  const toString = Object.prototype.toString;
  return toString.call(o).slice(8, -1).toLowerCase();
};
复制代码

 

 

不足之处,请指正

 

posted @   樊顺  阅读(132)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
历史上的今天:
2021-04-07 CSS实现子元素水平垂直居中的6种方式
点击右上角即可分享
微信分享提示