js 实现深深的拷贝

问题:

// 如果是基本数据类型
let a = 1;
let b = a;
a = 2;

console.log(a); // 2
console.log(b); // 1

// 如果是引用类型
let array = [1,3,2];
let array1 = array;

array = [1]


console.log(array); //[1]
console.log(array1)  // [1]

问题是:在引用类型中,我们只是想要改变 array的值,并没有想要改变array1 的值,但是array1 的值也跟着一起改变了

怎么回事:因为引用类型在内存中只存在一份,无论你修改了哪一个引用,都会影响到所有的引用。

怎么解决:https://www.jianshu.com/p/f4329eb1bace

这位大哥列举出了几种思路,最后得出一个比较完善的方法。

export function deepCopy(target){
    // 定义一个变量
    let result;
    //如果当前需要深拷贝的是一个对象的话
    if (typeof target === 'object'){
    //如果是一个数组的话
        if (Array.isArray(target)) {
            result = []; // 将result赋值为一个数组,并且执行遍历
            for (let i in target) {
                //递归克隆数组中的每一项
                result.push(deepClone(target[i]));
            }
         // 判断如果当前的值是null的话;直接赋值为null
        } else if(target===null) {
            result = null;
         // 判断如果当前的值是一个RegExp对象的话,直接赋值    
        } else if(target.constructor===RegExp){
            result = target;
        }else {
         // 否则是普通对象,直接for in循环,递归赋值对象的所有值
            result = {};
            for (let i in target) {
                result[i] = deepClone(target[i]);
            }
        }
     // 如果不是对象的话,就是基本数据类型,那么直接赋值
    } else {
        result = target;
    }
     // 返回最终结果
    return result;
}

 

依次遍历,如果是基本数据类型那么就复制,不是基本数据类型那么就继续遍历。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值