ChatGpt优化后的深拷贝函数

下面是一个更为优化的深拷贝函数:

function deepClone(obj, map = new WeakMap()) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }

  // 如果已经遍历过该对象,则直接返回对应的克隆对象
  if (map.has(obj)) {
    return map.get(obj);
  }

  const cloned = Array.isArray(obj) ? [] : {};

  // 记录每个需要拷贝的对象和对应的克隆对象的映射关系,用于处理循环引用
  map.set(obj, cloned);

  Object.keys(obj).forEach(key => {
    cloned[key] = deepClone(obj[key], map);
  });

  return cloned;
}
const obj = { a: 1, b: { c: 2 } };
const clonedObj = deepClone(obj);
console.log(clonedObj); // { a: 1, b: { c: 2 } }

优化点如下:

  1. 添加了一个可选参数 map,用于记录每个需要拷贝的对象和对应的克隆对象的映射关系,用于处理循环引用。这里使用了 JavaScript 的弱引用 WeakMap,如果某个拷贝对象已经在该映射表中有对应的克隆对象,则直接返回该克隆对象,避免进入死循环。
  2. 使用 Object.keys 替换循环遍历对象的方式,更加简洁高效。

下面对代码的每一行进行解释:

  1. function deepClone(obj, map = new WeakMap()) {:声明一个函数 deepClone,参数为 obj 和可选参数 map,用于实现深拷贝。将 map 的初始值设置为一个空的弱映射表。
  2. if (typeof obj !== 'object' || obj === null) { return obj; }:判断 obj 是否为对象或数组,或者是否为 null,如果不是则直接返回 obj。
  3. if (map.has(obj)) { return map.get(obj); }:如果 map 中已经存在当前要拷贝的对象(即已经遍历过该对象),则直接返回对应的克隆对象,避免进入死循环。
  4. const cloned = Array.isArray(obj) ? [] : {};:声明一个变量 cloned,如果 obj 是数组则将 cloned 赋值为一个空数组,如果 obj 是对象则将 cloned 赋值为一个空对象。
  5. map.set(obj, cloned);:将当前要拷贝的对象和对应的克隆对象的映射关系记录在 map 中。
  6. Object.keys(obj).forEach(key => { cloned[key] = deepClone(obj[key], map); });:使用 Object.keys 方法获取 obj 所有可枚举属性的 key,然后遍历每个 key,对 cloned 对象的这个 key 赋值为递归调用 deepClone 函数后返回的值,并传入当前的 map 映射表。
  7. return cloned;:返回最终生成的克隆对象。

调用方式与之前相同,例如:

const obj = { a: 1, b: { c: 2 } };
const clonedObj = deepClone(obj);
console.log(clonedObj); // { a: 1, b: { c: 2 } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜香小白鱼

如今生活困难,望支持一下,感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值