JSON.stringify()对原始类型有明确转换规则:undefined、函数、Symbol在对象中被忽略,数组中变null;null、布尔、数字(除Infinity/NaN外)、字符串按字面量转义;BigInt直接报错;Date调用toJSON()转ISO串,RegExp默认转{}。

JavaScript原始类型在JSON.stringify()中不是全部原样保留,而是有明确的转换逻辑:部分值被序列化为特定字符串,部分被忽略,还有部分直接报错。
undefined、函数、Symbol 的处理:直接丢弃
这三类值在对象属性中会被完全忽略,不生成任何 JSON 字段;在数组中则转为 null。
-
undefined:对象里键值为undefined的属性消失;数组中对应位置变成null - 函数(
function):同undefined,不参与序列化 -
Symbol:即使显式作为对象键(如{ [Symbol('a')]: 1 }),也不会被遍历到,直接跳过
null、布尔值、数字、字符串:按字面量直译
这些类型会转成标准 JSON 对应的字面量格式,无引号、大小写敏感、无额外修饰。
-
null→null(小写,不加引号) -
true/false→true/false -
0、-42、3.14、Infinity、-Infinity、NaN→ 前三个正常输出;后三个统一转为null - 字符串 → 加双引号,自动转义特殊字符(如
"\n"、"\"")
BigInt 不支持,直接抛错
JSON.stringify() 原生不识别 BigInt 类型。只要对象中任意层级包含 BigInt(例如 { x: 123n }),调用时会立即抛出 TypeError: Do not know how to serialize a BigInt。
立即学习“Java免费学习笔记(深入)”;
- 需手动预处理:转为字符串(
123n.toString())或数字(注意精度丢失风险) - 也可通过
replacer函数拦截并转换
Date、RegExp 等对象类型:走 .toJSON() 或默认转换
虽然不属于原始类型,但常与原始类型混用,其行为影响整体结果:
-
Date:若存在.toJSON()方法(原生有),自动调用,返回 ISO 字符串(如"2023-01-01T00:00:00.000Z") -
RegExp:没有.toJSON(),默认转为{}(空对象) -
undefined/function/Symbol在对象中作为值时,同上文一样被忽略










