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

详解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日

相关文章

  • JS实现网页抢购功能(触发,终止脚本)

    JS实现网页抢购功能可以基于浏览器的自动化工具,如selenium或者puppeteer,完成批量请求或模拟用户行为。在实现过程中,需要明确以下几个步骤: 登录并保持会话:在许多电商网站中,进行抢购之前首先需要登录账户。可以通过模拟登录的方式,实现自动输入账号密码并完成登录。在登录完成之后,需要保持会话以便于提交订单等后续的操作。 找到目标商品页面:一般情况…

    JavaScript 2023年6月10日
    00
  • 一行代码告别document.getElementById

    下面是“一行代码告别document.getElementById”的完整攻略: 1. document.querySelector方法说明 document.querySelector 方法用于获取文档中匹配指定选择器的第一个元素。这个方法返回的是一个元素节点对象,如果没有匹配到元素则返回null。 语法: element = document.query…

    JavaScript 2023年6月10日
    00
  • 每个 JavaScript 工程师都应懂的33个概念

    “每个 JavaScript 工程师都应懂的33个概念”是一本非常重要的书籍,其中记录了每个JavaScript工程师需要掌握的33个概念。在本文中,我会详细介绍这本书中的每个概念,以及如何应用它们。 1. 理解页面加载和渲染 在这个章节里,作者介绍了关于页面加载过程的一些细节,以及如何优化页面的加载速度。其中提到了减少HTTP请求、使用无阻塞脚本、使用CS…

    JavaScript 2023年5月18日
    00
  • 原生javascript中this几种常见用法总结

    当在JavaScript中使用this关键字时,它的值取决于该函数如何被调用。下面总结了几种常见的this用法。 全局上下文中的this 在全局作用域中使用this,this的值是指向全局对象,这在浏览器中通常是window对象。例如: console.log(this === window); // true 函数上下文中的this 在函数作用域中使用th…

    JavaScript 2023年5月28日
    00
  • Javascript中return的使用与闭包详解

    让我为您详细讲解Javascript中return的使用与闭包详解。 Javascript中return的使用 在JavaScript中,return语句用于将函数执行的结果返回给调用方。当函数调用return时,它会停止执行函数并返回一个值。除非使用void关键字,否则JavaScript中的函数始终返回一个值,无论是直接返回还是返回undefined。下…

    JavaScript 2023年6月10日
    00
  • 动态加载JavaScript文件的3种方式

    当我们开发一个网站时,经常需要用到Javascript代码来处理交互逻辑和动态效果。通常,为了让代码更清晰、易于维护,我们会将Javascript代码分离到一个或多个独立的文件中。这时就需要用到动态加载Javascript文件的功能。下面介绍3种常用的方式: 1. 通过DOM创建script元素 动态加载Javascript文件最常用的方式就是通过DOM创建…

    JavaScript 2023年5月27日
    00
  • javascript控制Div层透明属性由浅变深由深变浅逐渐显示

    要实现”JavaScript控制DIV层透明属性由浅变深由深变浅逐渐显示”,可以通过以下步骤实现: 创建一个DIV层并设置CSS样式,包括宽度,高度,背景颜色、位置等信息。如下所示: “`html “` 在JavaScript代码中获取该DIV层对象。 javascript var myDiv = document.getElementById(“myD…

    JavaScript 2023年6月11日
    00
  • JS实现提示效果弹出及延迟隐藏的功能

    JS实现提示效果的弹出及延迟隐藏功能,可以通过以下步骤来完成: 步骤一:创建提示框HTML结构 首先,我们需要创建一个提示框的HTML结构,可以使用div标签模拟弹出框,也可以使用ul或者table标签,此处以使用div标签为例。 <div id="tip-box" style="display:none;"&g…

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