详解JavaScript对象序列化:JSON.stringify与JSON.parse完整指南
本文深入解析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对象序列化的主要内容,希望能为您的学习提供帮助。
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
