一文搞懂 JSON 序列化与反序列化

29 阅读1分钟

在前端开发中,JSON.stringify()JSON.parse() 常用于数据存储、传输,也可以实现简单的对象深拷贝。我们通过一个对比例子,直观看出它的作用。

不使用序列化:引用赋值的问题

const user = { name: '小明', hobbies: ['读书'] };

// 直接赋值(只是复制引用)
const copy1 = user;
copy1.name = '小红';
copy1.hobbies.push('游泳');

console.log(user); 
// { name: '小红', hobbies: ['读书', '游泳'] } ← 原对象被意外修改!

❌ 问题:copy1user 指向同一块内存,修改会互相影响。

使用 JSON 序列化:实现独立副本

const user = { name: '小明', hobbies: ['读书'] };

// 通过序列化 + 反序列化创建新对象
const copy2 = JSON.parse(JSON.stringify(user));
copy2.name = '小红';
copy2.hobbies.push('游泳');

console.log(user); 
// { name: '小明', hobbies: ['读书'] } ← 原对象未受影响 ✅

✅ 优点:完全断开引用,得到一个独立的数据副本。

注意事项

  • 仅适用于纯数据对象(不含函数、undefined、Symbol、Date、RegExp 等)
  • 无法处理循环引用
  • 复杂场景建议使用 structuredClone()lodash.cloneDeep()

小结

方式是否独立拷贝适用场景
直接赋值 (a = b)❌ 否临时引用
JSON.parse(JSON.stringify())✅ 是(简单对象)localStorage、API 请求、简单深拷贝

用对方法,避免“改一个,全变”的坑!