json.stringify()仅能正确处理null、布尔值、数字、字符串、数组及普通对象的自身可枚举属性;不支持undefined、函数、symbol、bigint、date、regexp、map、set、promise等,循环引用会报错。

JavaScript 中最常用、最标准的方式是使用 JSON.stringify() 方法,它能把普通对象(以及数组、基本类型等)安全地转成 JSON 格式的字符串。
哪些对象能被 JSON.stringify 正确处理?
该方法只处理可序列化的属性:
- 对象自身的、可枚举的、值为 null、布尔值、数字、字符串、数组或另一个普通对象 的属性
- 不处理 undefined、函数、Symbol、BigInt、Date 实例(会变成字符串)、RegExp、Map、Set、Promise 等
- 循环引用的对象会直接报错:
TypeError: Converting circular structure to JSON
基础用法示例
直接调用即可:
const obj = { name: "Alice", age: 30, hobbies: ["reading", "coding"] };
const str = JSON.stringify(obj);
// → '{"name":"Alice","age":30,"hobbies":["reading","coding"]}'
进阶用法:格式化与过滤
支持两个可选参数,提升实用性:
- 第二个参数(replacer):可以是数组(指定保留的键名),也可以是函数(自定义每个值的处理逻辑)
- 第三个参数(space):控制缩进,传入数字(如 2)或字符串(如 " ")实现美化输出
const user = {
id: 1,
name: "Bob",
password: "123456", // 敏感字段,不想暴露
createdAt: new Date()
};
// 过滤 password,且格式化输出
const safeStr = JSON.stringify(
user,
(key, value) => key === "password" ? undefined : value,
2
);
// →
// {
// "id": 1,
// "name": "Bob",
// "createdAt": "2024-05-20T10:30:00.000Z"
// }
处理特殊类型(Date / BigInt / 循环引用等)
原生 JSON.stringify 不支持这些,需手动预处理:
-
Date:通常转成 ISO 字符串,可借助
toJSON()方法或 replacer 函数统一处理 - BigInt:必须在 replacer 中显式转成字符串或数字(注意精度丢失风险)
-
循环引用:需用第三方库(如
flatted)或自己实现递归跟踪逻辑,避免报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











