详解JSON.stringify()的5个秘密特性

yizhihongxing

详解JSON.stringify()的5个秘密特性

JSON.stringify() 是将一个 JavaScript 对象或值转换为 JSON 字符串的方法。但是,如果您不了解 JSON.stringify() 的所有“秘密特性”,则无法在实际开发中充分利用它的性能和灵活性。以下是5个最重要的“秘密特性”。

1. JSON.stringify() 可以通过选项参数输出特定的 JSON 字符串格式

在使用 JSON.stringify() 转换对象时,您可以传递一个选项参数(可以是一个对象)。这使您可以修改组合生成的 JSON 字符串的行为。例如,您可以使用选项参数缩进并统一生成的 JSON 字符串中属性/值对的执行方式。以下是一个示例:

const person = {
  name: "Alice",
  age: 30,
  interests: ["coding", "reading"],
  address: {
    city: "Shanghai",
    country: "China"
  }
};

const jsonStr = JSON.stringify(person, null, 2); 
console.log(jsonStr);

这段代码会将 person 对象转换成 JSON 格式,其中第二个参数 null 指定了过滤器函数(这个示例不使用过滤器)。第三个参数 2 指示输出应该使用两个空格的缩进格式,输出的结果如下:

{
  "name": "Alice",
  "age": 30,
  "interests": [
    "coding",
    "reading"
  ],
  "address": {
    "city": "Shanghai",
    "country": "China"
  }
}

2. JSON.stringify() 可以处理“循环引用”的情况

如果您尝试将有循环引用的对象(例如,一个对象引用了一个对象,而前面的对象又引用了后者)编码为 JSON 字符串,您会遇到错误。但是,如果您使用 JSON.stringify(),将对象作为“引用”进行编码,可以避免这个问题,并确保循环引用得到正确处理。以下是一个示例:

const person = {
  name: "Alice",
  friends: []
};

person.friends.push(person);

const jsonStr = JSON.stringify(person); 
console.log(jsonStr);

这段代码会输出以下 JSON 字符串:

{
  "name": "Alice",
  "friends": [
    "[Circular ~]"
  ]
}

注意,这里的 [Circular ~] 表示对该对象的引用。

3. JSON.stringify() 可以替换对象属性的值

您可以提供一个转换函数,该函数将处理对象期望序列化的属性值(例如,剥离一个影响性能的日期对象)。以下是一个示例:

const person = {
  name: "Alice",
  age: 30,
  dateOfBirth: new Date("1993/01/01")
};

const jsonStr = JSON.stringify(person, function replacer(key, value) {
  if (key === "dateOfBirth") {
    return value.getFullYear();
  }
  return value;
}, 2); 
console.log(jsonStr);

这段代码会将 person 对象转换成 JSON 格式,受到转换函数的影响,dateOfBirth 属性的值被替换为出生日期的年份。输出的结果如下:

{
  "name": "Alice",
  "age": 30,
  "dateOfBirth": 1993
}

4. JSON.stringify() 可以序列化函数

JSON.stringify() 没有办法序列化函数。但是,您可以增加一个选项参数,获得函数源代码的序列化字符串。以下是一个示例:

const func = function sayHello() { console.log("Hello, world!"); }
const jsonStr = JSON.stringify(func, function(key, value) {
  if (typeof value === 'function') {
    return value.toString();
  }
  return value;
}, 2);

console.log(jsonStr);

这段代码将输出以下 JSON 字符串:

"function sayHello() { console.log(\"Hello, world!\"); }"

5. JSON.stringify() 可以重写原型的 toJSON 方法

您可以轻松地改写对象原型的 toJSON 方法,以自定义在使用 JSON.stringify() 序列化该对象时的行为。以下是一个示例:

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  toJSON() {
    return {
      name: this.name.toUpperCase(),
      age: this.age
    };
  }
}

const alice = new Person("Alice", 30);
const jsonStr = JSON.stringify(alice, null, 2); 
console.log(jsonStr);

这段代码会将带有 toJSON()Person 类型的对象转换成 JSON 格式。受到 toJSON() 的影响,输出的结果如下:

{
  "name": "ALICE",
  "age": 30
}

总结

JSON.stringify() 不仅能简单地将 JavaScript 对象转化为 JSON 格式字符串,还具有灵活性强,表现力丰富的特性,它可以方便地实现对象的自定义序列化,处理循环引用、json格式控制和函数序列化等问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JSON.stringify()的5个秘密特性 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript中数组对象的那些自带方法介绍

    下面就为大家详细介绍JavaScript中数组对象的自带方法。 1. 增加、删除、修改元素 push、pop、shift、unshift方法 push方法:在数组的末尾插入一个或多个元素,并返回数组新的长度。 pop方法:删除数组的最后一个元素,并返回该元素的值。 shift方法:删除数组的第一个元素,并返回该元素的值。 unshift方法:在数组的开头插入…

    JavaScript 2023年5月27日
    00
  • Javascript数组方法reduce的妙用之处分享

    关于“Javascript数组方法reduce的妙用之处分享”的完整攻略,我将从以下几个方面进行讲解: 什么是reduce方法 reduce方法的用法和语法 reduce方法的妙用之处 两个示例说明 1. 什么是reduce方法 reduce() 是一种 Javascript 数组方法,用于迭代数组中的所有元素,并通过一个函数返回单个值。这个函数接受四个参数…

    JavaScript 2023年5月27日
    00
  • HTML实现双11抢劵(设定时间打开抢券的页面)

    实现双11抢劵的功能,需要用到HTML语言和JavaScript脚本。 具体步骤如下: 在HTML文件中添加一个按钮,设置其id为”open-btn”,用于点击后打开抢券页面: <button id="open-btn">打开抢券页面</button> 在JavaScript文件中,为按钮绑定click事件,用于判…

    JavaScript 2023年6月10日
    00
  • js删除对象属性的多种方法举例

    关于“js删除对象属性的多种方法举例”的攻略,我来给你详细讲解一下。 一、删除对象属性的多种方法 1. 使用 delete 操作符 使用 delete 操作符可以删除对象的指定属性。具体语法如下: delete objectName.propertyName; 其中,objectName 是指要删除属性的对象,propertyName 是指要删除的属性名。需…

    JavaScript 2023年5月27日
    00
  • 详解vue的双向绑定原理及实现

    关于《详解vue的双向绑定原理及实现》的攻略,我们可以分为以下几个部分进行讲解: 一、什么是双向绑定?为何要使用双向绑定? 双向绑定 Vue.js 中的双向绑定是将数据与视图进行双向绑定。在数据发生变化时,视图会自动更新并显示最新的状态;而在用户交互改变视图的值时,数据也会自动更新。 使用双向绑定的好处 使用双向绑定可以使我们写的代码更加简洁明了,减少了大量…

    JavaScript 2023年6月11日
    00
  • vue parseHTML源码解析hars end comment钩子函数

    Vue.js是一个流行的前端框架,提供了丰富的解决方案来构建应用。其中之一就是可以使用parseHTML方法来解析HTML字符串,并生成对应的AST树。在这个解析过程中,Vue提供了一些hooks来让我们在解析过程中添加一些自定义的逻辑,其中就包括end和comment这两个hooks。 什么是parseHTML Vue提供了一个辅助函数parseHTML,…

    JavaScript 2023年6月10日
    00
  • JavaScript 文件加载与阻塞问题之性能优化案例详解

    以下是“JavaScript 文件加载与阻塞问题之性能优化案例详解”的完整攻略。 什么是JavaScript文件加载与阻塞问题? 当我们为网站添加JavaScript代码时,我们通常需要在 HTML 文件中使用<script>标签引入 JavaScript 文件。但是,如果 JavaScript 文件非常大,它们可能会阻止页面的加载和渲染,导致用…

    JavaScript 2023年5月27日
    00
  • javascript 封装Date日期类实例详解

    Javascript 封装 Date 日期类实例详解 在 Javascript 中,Date 类是表示日期和时间的对象,Date 有多种构造函数和方法,可以根据需求获取、设置日期或时间,也可以将日期对象转换为字符串。 创建 Date 对象 可以使用 new Date() 构造函数创建 Date 对象,如果没有传递参数,则创建当前日期和时间的 Date 对象。…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部