js 对象深拷贝的五种方法

张裕  论坛元老 | 2025-3-28 10:27:47 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1388|帖子 1388|积分 4164

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
js 对象深拷贝


今天遇到一个bug ,子组件页面修改了内容,但是按了取消生存按钮,没有将数据传回父组件的,但是父组件的数据改了,缘故起因是通过子组件接受父组件的参数对象层级深没有做深拷贝的缘故起因。
   在 JavaScript 中,深拷贝是指复制一个对象及其所有嵌套对象的完整副本,而不是仅仅复制引用。以下是几种实现深拷贝的方法:
  方法 1:使用 JSON.parse 和 JSON.stringify

这是最简朴的方法,但有一些限定(比方,无法拷贝函数、undefined、Symbol 等)。
  1. const obj = { a: 1, b: { c: 2 } };
  2. const deepCopy = JSON.parse(JSON.stringify(obj));
  3. console.log(deepCopy); // { a: 1, b: { c: 2 } }
复制代码
注意


  • 无法拷贝函数、undefined、Symbol。
  • 不支持循环引用。

方法 2:使用递归实现深拷贝

手动实现一个递归函数来处理对象和数组。
  1. function deepClone(obj) {
  2.     if (obj === null || typeof obj !== "object") {
  3.         return obj; // 基本类型直接返回
  4.     }
  5.     // 创建一个新对象或数组
  6.     const copy = Array.isArray(obj) ? [] : {};
  7.     for (const key in obj) {
  8.         if (obj.hasOwnProperty(key)) {
  9.             copy[key] = deepClone(obj[key]); // 递归拷贝
  10.         }
  11.     }
  12.     return copy;
  13. }
  14. const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
  15. const deepCopy = deepClone(obj);
  16. console.log(deepCopy); // { a: 1, b: { c: 2 }, d: [3, 4] }
复制代码

方法 3:使用 lodash 库

lodash 是一个流行的 JavaScript 工具库,此中的 cloneDeep 方法可以轻松实现深拷贝。
  1. import _ from "lodash";
  2. const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
  3. const deepCopy = _.cloneDeep(obj);
  4. console.log(deepCopy); // { a: 1, b: { c: 2 }, d: [3, 4] }
复制代码
长处


  • 支持复杂对象(如循环引用)。
  • 可靠且易用。

方法 4:使用 structuredClone(现代浏览器支持)

structuredClone 是一种原生方法,用于深拷贝对象。
  1. const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
  2. const deepCopy = structuredClone(obj);
  3. console.log(deepCopy); // { a: 1, b: { c: 2 }, d: [3, 4] }
复制代码
长处


  • 支持循环引用。
  • 原生方法,性能较好。
注意


  • 仅在现代浏览器和 Node.js 17+ 中支持。

方法 5:使用 Object.create 和递归

通过 Object.create 创建新对象,并递归拷贝属性。
  1. function deepClone(obj) {
  2.     if (obj === null || typeof obj !== "object") {
  3.         return obj;
  4.     }
  5.     const copy = Object.create(Object.getPrototypeOf(obj));
  6.     for (const key of Object.keys(obj)) {
  7.         copy[key] = deepClone(obj[key]);
  8.     }
  9.     return copy;
  10. }
  11. const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
  12. const deepCopy = deepClone(obj);
  13. console.log(deepCopy); // { a: 1, b: { c: 2 }, d: [3, 4] }
复制代码

总结



  • 简朴对象:可以使用 JSON.parse(JSON.stringify(obj)。
  • 复杂对象:保举使用 lodash.cloneDeep 或 structuredClone。
  • 自界说实现:可以使用递归函数处理特殊需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表