在现代前端开发中,JSON 处理是日常工作中不可或缺的一部分。虽然大多数开发者都熟悉基础的 JSON.stringify()
用法,但其进阶功能却常常被忽视。本文将深入探讨 JSON.stringify()
的高级特性,帮助你在实际开发中更高效地处理数据序列化。
基础回顾
JSON.stringify()
方法将一个 JavaScript 对象或值转换为 JSON 字符串:
const obj = { name: "谜语人", age: 25 };
console.log(JSON.stringify(obj));
// 输出: {"name":"谜语人","age":25}
进阶特性
1. 使用 replacer 数组过滤属性
JSON.stringify()
的第二个参数可以接受一个数组,用于指定需要包含在结果中的属性:
const obj = {
name: "谜语人",
age: 25,
password: "123456789",
city: "广岛"
};
// 只序列化 'name' 和 'age' 属性
const result = JSON.stringify(obj, ["name", "age"]);
console.log(result);
// 输出: {"name":"谜语人","age":25}
这种方式非常适合在需要排除敏感数据(如密码)或仅需部分字段的场景中使用。
2. 使用 replacer 函数自定义序列化
第二个参数也可以是一个函数,提供更精细的控制:
const obj = {
name: "黑衣人",
age: 28,
password: "admin1111",
lastLogin: new Date(),
todos: [
{ id: 1, text: "啊啊啊啊啊啊", done: true },
{ id: 2, text: "踩踩踩踩踩踩踩踩踩踩踩踩", done: false }
]
};
function replacer(key, value) {
// 过滤掉密码字段
if (key === "password") return undefined;
// 将 Date 对象转换为 ISO 字符串
if (value instanceof Date) return value.toISOString();
// 将布尔值转换为更友好的文本
if (key === "done") {
return value ? "Completed" : "Pending";
}
// 默认返回原值
return value;
}
const result = JSON.stringify(obj, replacer, 2);
console.log(result);
3. 使用 space 参数美化输出
第三个参数(选填)控制结果字符串的缩进:
// 使用数字指定缩进空格数
JSON.stringify(obj, null, 2);
// 使用字符串作为缩进符
JSON.stringify(obj, null, "----");
4. 实现 toJSON() 方法自定义序列化
如果对象拥有 toJSON()
方法,JSON.stringify()
会调用该方法并使用其返回值进行序列化:
const obj = {
name: "Alice",
age: 25,
sensitiveInfo: "This should not be logged entirely",
toJSON: function() {
return {
name: this.name,
age: this.age,
generatedAt: new Date().toISOString(),
// 只显示敏感信息的前10个字符
sensitiveInfo: this.sensitiveInfo.substring(0, 10) + "..."
};
}
};
console.log(JSON.stringify(obj));
// 输出: {"name":"Alice","age":25,"generatedAt":"2025-09-02T08:25:42.000Z","sensitiveInfo":"This shoul..."}
这种方式特别适合需要统一处理对象序列化逻辑的场景。
实际应用场景
数据脱敏:在日志记录或数据传输时排除敏感字段
日期处理:统一将 Date 对象转换为 ISO 字符串格式
数据筛选:根据不同需求输出对象的不同属性集合
调试输出:使用缩进参数生成更易读的调试信息
注意事项
JSON.stringify()
无法序列化函数、undefined 和 Symbol 值遇到 undefined、函数或 Symbol 时,在对象中会被忽略,在数组中会被转换为 null
循环引用会导致错误
总结
JSON.stringify()
的进阶功能提供了强大的数据序列化控制能力。通过合理使用 replacer 参数、space 参数和 toJSON() 方法,我们可以实现更精确、安全的数据处理,提升代码质量和可维护性。
掌握这些进阶技巧,将使你在处理复杂数据序列化场景时游刃有余,写出更健壮、更高效的 JavaScript 代码。