前端手撕代码——手撕深、浅拷贝

文章介绍了JavaScript中对象拷贝的概念,提供了浅拷贝的实现函数`shallowCopy`和解决循环引用问题的深拷贝函数`deepClone`。通过示例`obj1`和`obj2`展示了深拷贝如何处理复杂对象和循环引用的情况。
摘要由CSDN通过智能技术生成

浅拷贝

浅拷贝只能拷贝一层对象

// 浅拷贝只能拷贝一层对象
function shallowCopy(params){
  if(!params || typeof params !== 'object'){
    return params;
  }
  let newObject = Array.isArray(params) ? [] : {};
  for(let key in params){
    if(params.hasOwnProperty(key)){
      newObject[key] = params[key];
    }
  }
  return newObject;
}

深拷贝

// 深拷贝解决循环引用爆栈的问题
function deepClone(source, map = new Map()){
  // 为空
  if(source == null) return source;
  // 为日期类型
  if(source instanceof Date) return new Date(source);
  // 为Reg类型
  if(source instanceof RegExp) return new RegExp(source);
  // 如果是函数的话也不需要深拷贝
  if(typeof source !== 'object') return source;
  
  if(map.has(source)) return map.get(source);

  let newObj = Array.isArray(source) ? []: {};
  map.set(source, newObj);
  for(let key in source){
    if(source.hasOwnProperty(key)){
      newObj[key] = deepClone(source[key], map);
    }
  }
  return newObj;
}

const obj1 = {
  name: 123,
  num: 111,
  arr: [1, 2, 3],
  child: {
    arr: [1,2,3,4]
  },
  next: 'obj1',
}

obj1.next = obj1;

const obj2 = deepClone(obj1);
console.log(obj1);
console.log(obj2);
console.log(obj1['child'] === obj2['child']);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值