在前端开发中,JSON.stringify() 和 JSON.parse() 常用于数据存储、传输,也可以实现简单的对象深拷贝。我们通过一个对比例子,直观看出它的作用。
不使用序列化:引用赋值的问题
const user = { name: '小明', hobbies: ['读书'] };
// 直接赋值(只是复制引用)
const copy1 = user;
copy1.name = '小红';
copy1.hobbies.push('游泳');
console.log(user);
// { name: '小红', hobbies: ['读书', '游泳'] } ← 原对象被意外修改!
❌ 问题:
copy1和user指向同一块内存,修改会互相影响。
使用 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 请求、简单深拷贝 |
用对方法,避免“改一个,全变”的坑!