详解JavaScript对象序列化:JSON.stringify与JSON.parse完整指南

作者:闭包旅人

时间:2026-10-29

浏览:83

本文深入解析JavaScript中的对象序列化机制,重点介绍JSON.stringify()与JSON.parse()函数的完整用法。详细阐述序列化原始值、对象及数组时的处理规则,包括对undefined、NaN、函数等特殊值的处理,以及filter和indent参数的应用。同时涵盖JSON.parse()中reviver函数的使用,帮助开发者掌握数据持久化与网络传输的核心技术。

文章目录

对象序列化的基本概念

一、什么是对象序列化?

从直观理解来看,对象序列化指的是将对象当前的状态信息转换为字符串形式的过程;

从学术定义角度,序列化(Serialization)是指将对象的状态信息转换为可存储或可传输形式的过程(参考“百度百科—序列化”);

对象序列化的必要性

二、为什么需要对象序列化?

任何技术存在的背后都有其实际应用场景。既然涉及对象序列化,我们首先从一个具体的对象实例开始探讨:


var obj = {x:1, y:2};

当代码执行时,对象obj的数据会存储在内存的特定区域,而变量obj本身仅保存指向该内存地址的引用。简而言之,对象obj是程序运行期间在内存中维持的一种数据结构,一旦程序终止或设备断电,该对象便会消失。若需将对象obj的内容持久化到磁盘(即在断电后仍能保留),就必须对obj进行序列化,即将其内容转换为字符串格式并保存至磁盘。此外,若需通过HTTP协议将对象obj的内容发送至客户端,同样需要先执行序列化操作,客户端接收到字符串后,再通过反序列化(即将字符串还原为对象)解析出原始对象。这正对应了“百度百科—序列化”中提到的两大核心作用:存储与传输。

JavaScript中的对象序列化

三、JavaScript中的对象序列化

JSON的全称是“JavaScript Object Notation”(JavaScript对象表示法)。在ECMAScript 5标准中,提供了内置函数JSON.stringify()和JSON.parse(),分别用于JavaScript对象的序列化和还原操作。这两个函数的使用方式非常简洁:

对象序列化的基本概念

对象序列化的基本概念

观察exampleStr和exampleObj2可以发现,其中并不包含y:undefined的内容。这表明JSON语法是JavaScript语法的子集,它无法表示JavaScript中的所有数据类型。对于JSON语法不支持的属性,在序列化过程中会被自动忽略。具体规则如下:

  • ① 对于JavaScript中的五种原始类型,JSON语法仅支持数字、字符串、布尔值和null四种类型,不支持undefined;
  • ② NaN、Infinity和-Infinity在序列化后的结果均为null;
  • ③ JSON语法不支持函数类型;
  • ④ 除RegExp和Error对象外,JSON语法支持其他所有对象类型;
  • ⑤ 日期对象序列化后的结果为ISO格式的字符串,但JSON.parse()解析后仍保持字符串形态,不会将其还原为日期对象;
  • ⑥ JSON.stringify()仅能序列化对象的可枚举自有属性;

从上述示例可以看出,在符合上述规则的前提下,还可以利用对象的序列化和反序列化来实现对象的深拷贝。

以上介绍了JSON.stringify()和JSON.parse()的基本用法,但这两个方法的功能远不止于此:

JSON.stringify()完整用法

四、JSON.stringify()完整用法

1. 简介

用于序列化原始值、对象或数组

2. 语法概要

JSON.stringify(o[, filter][, indent])

3. 参数说明

o:需要转换为JSON字符串的原始值、对象或数组

filter:可选参数,可以是数组或函数

indent:可选参数,可以是数值或字符串

4. 返回值

返回一个代表o值的JSON格式字符串,该字符串已通过filter过滤,并根据indent参数进行了格式化

5. 详细描述

① 当对象o自身包含toJSON()方法时,JSON.stringify()会调用o的toJSON()方法,并使用该方法的返回值而非对象本身进行字符串化;

② 如果filter存在且为函数,则该函数的返回值将作为JSON.stringify()的最终返回值。该函数接收两个参数:第一个参数为空字符串,第二个参数为对象o;

③ 如果filter存在且为字符串数组(若数组中包含数字,数字会自动转换为字符串),则对象o中不在该数组中的属性名将在序列化时被省略,且返回字符串中属性的顺序与该数组中属性的顺序一致;

④ JSON.stringify()默认返回不带任何空格或换行符的紧凑字符串。若需输出更易读的字符串,需指定第三个参数。若第三个参数为1至10之间的数值,JSON.stringify()会在每一“层级”输出时插入换行符和指定数量的空格。若第三个参数为非空字符串,则JSON.stringify()会插入换行符和该字符串(仅取前十个字符)用于层级缩进;

JSON.parse()完整用法

五、JSON.parse()完整用法

1. 简介

用于解析JSON格式的字符串

2. 语法概要

JSON.parse(s[, reviver])

3. 参数说明

s:需要解析的字符串

reviver:可选参数,用于转换解析值的函数

4. 返回值

返回一个对象、数组或原始值。该返回值是从s中解析得到的(可能经过reviver修改);

5. 详细描述

① 如果指定了reviver函数,该函数会为从s中解析的每一个原始值(不包含这些原始值的对象或数组本身)调用一次。调用reviver时带有两个参数:第一个参数是属性名(对象的属性名或转换为字符串的数组索引),第二个参数是对象属性或数组元素的原始值。reviver函数的返回值将作为JSON.parse()的最终返回值;

以上就是关于JavaScript对象序列化的主要内容,希望能为您的学习提供帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章