likes
comments
collection
share

手撕JS中的JSON.stringify()

作者站长头像
站长
· 阅读数 22

手撕JS中的JSON.stringify()

大家好,我是茶老师!在现代Web应用程序开发中,JavaScript对象和JSON(JavaScript Object Notation)格式之间的转换是非常常见的。开发人员通常使用JSON.stringify()方法将JavaScript对象序列化为JSON格式的字符串。但是,如果你想要深入了解JSON.stringify()的实现原理,或者想要手动实现一个类似的方法,那么本文将为您提供一个指导。

本文中,我们将介绍JSON.stringify()的实现原理,并逐步实现一个简化版的JSON.stringify()方法。

JSON.stringify()的实现原理

JSON.stringify()是一个内置方法,用于将JavaScript对象转换为JSON格式的字符串。它接受一个JavaScript对象作为参数,然后遍历对象的属性,并将它们转换为JSON格式的字符串。这个方法还支持一些选项,可以在转换过程中控制输出结果的格式。

下面是一个示例JavaScript对象:

const obj = {
  name: "Alice",
  age: 25,
  isMarried: true,
  hobbies: ["reading", "traveling", "photography"],
  address: {
    city: "New York",
    state: "NY"
  }
};

使用JSON.stringify()将这个对象转换为JSON格式的字符串,可以得到以下结果:

'{"name":"Alice","age":25,"isMarried":true,"hobbies":["reading","traveling","photography"],"address":{"city":"New York","state":"NY"}}'

JSON.stringify()的实现可以分为以下几个步骤:

  1. 判断输入参数是否是一个对象类型。如果不是对象类型,则直接返回这个值。
  2. 创建一个数组,用于存储对象的属性名和对应的值。
  3. 遍历对象的属性,将属性名和对应的值添加到数组中。
  4. 根据选项参数控制输出结果的格式。
  5. 将数组转换为JSON格式的字符串并返回。

现在我们知道了JSON.stringify()的实现原理,接下来让我们手动实现一个简化版的JSON.stringify()方法。

手动实现JSON.stringify()

首先,我们需要定义一个名为stringify的函数,并将要转换为JSON格式的对象作为参数传递进去。接着,我们需要定义一个名为result的数组,用于存储对象的属性名和对应的值。最后,我们需要将result数组转换为JSON格式的字符串并返回。

function stringify(obj) {
  const result = [];
  // 遍历对象的属性
  for (let key in obj) {
    // 判断属性值是否是函数类型或undefined类型
    if (typeof obj[key] === 'function' || typeof obj[key] === 'undefined') {
      continue;
    }

    // 将属性名和对应的值添加到数组中
    const value = obj[key];

    if (typeof value === 'string') {
      result.push(`"${key}":"${value}"`);
    } else if (typeof value === 'number' || typeof value === 'boolean' || value === null) {
      result.push(`"${key}":${value}`);
    } else if (typeof value === 'object') {
      // 如果属性值是一个对象,则递归调用stringify方法
      const nested = stringify(value);
      result.push(`"${key}":${nested}`);
    }
  }
  // 将result数组转换为JSON格式的字符串并返回
  return `{${result.join(',')}}`;
}

现在,我们可以测试一下我们的实现是否有效。我们使用上面的示例JavaScript对象,并将它传递给我们手动实现的stringify()方法。

const obj = {
  name: 'Alice',
  age: 25,
  isMarried: true,
  hobbies: ['reading', 'traveling', 'photography'],
  address: { city: 'New York', state: 'NY' },
};
console.log(stringify(obj));

格式化完善

如果你想要进一步完善你的实现,你可以添加一些选项来控制输出结果的格式。例如,你可以添加一个名为pretty的选项,用于将输出结果格式化为更易读的形式。

function stringify(obj, pretty) {
  const result = [];

  // 遍历对象的属性
  for (let key in obj) {
    // 判断属性值是否是函数类型或undefined类型
    if (typeof obj[key] === "function" || typeof obj[key] === "undefined") {
      continue;
    }

    // 将属性名和对应的值添加到数组中
    const value = obj[key];

    if (typeof value === "string") {
      result.push(`"${key}":"${value}"`);
    } else if (typeof value === "number" || typeof value === "boolean" || value === null) {
      result.push(`"${key}":${value}`);
    }

    // 如果属性值是一个对象,则递归调用stringify方法
    else if (typeof value === "object") {
      const nested = stringify(value, pretty);
      result.push(`"${key}":${nested}`);
    }
  }

  // 根据pretty选项控制输出结果的格式
  if (pretty) {
    return `{\n${result.join(",\n")}\n}`;
  } else {
    return `{${result.join(",")}}`;
  }
}

现在,我们可以传递一个pretty选项来控制输出结果的格式:

console.log(stringify(obj, true));

输出结果将被格式化为更易读的形式:

{
  "name":"Alice",
  "age":25,
  "isMarried":true,
  "hobbies":[
    "reading",
    "traveling",
    "photography"
  ],
  "address":{
    "city":"New York",
    "state":"NY"
  }
}

结论

JSON.stringify()是一个非常有用的内置方法,用于将JavaScript对象转换为JSON格式的字符串。通过手动模拟实现这个方法,我们可以更深入地了解它的实现原理,并且可以更好地掌握JSON格式的知识。

OK,今天的文章就到这里了,看完本文如果觉得对你有些许帮助的话,记得三连呐!

我是爱分享前端基础知识的茶茶茶茶茶 茶老师!

转载自:https://juejin.cn/post/7208460550124093499
评论
请登录