深拷贝与浅拷贝

浅拷贝

拷贝就是把一个东西复制出一份一模一样的,以下就算一个拷贝,把a的值,一模一样的复制到b里面

var a = 2;
var b = a;

浅拷贝对于原始类型严格来说是不存在的,主要是针对对象、数组引用类型来说的

  var p1 = {
        name:'张三',
        age: 18,
        sex:'male',
        height:  180,
        weight: 140,
        son:{
            first: 'zhang',
            sencod: 'si',
            third: 'wu',
        }
    }
     var p2 = p1;
     p2.name = 'lisi';
     console.log(p1, p2);

上面的写法拷贝的并不是对象的值,而是指向对象值的引用,就会导致改了一个另一个也会跟着改,虽然“拷贝”了,但是两个对象没有完全独立
解决方法
既然两个对象都指向同一个引用,那我们就将要拷贝的目标对象遍历,创建一个新对象作为被拷贝后的对象

   var p2 = {};
    for(var key in p1){
    if(p1.hasOwnProperty(key){
        p2[key] = p1[key];
       }
    }

上面写法任然存在问题,它只处理了原始值,没有处理引用值,对象中的引用值任然是会指向同一个地址的,因此就需要深拷贝

深拷贝

解决浅拷贝中对象属性为引用值的情况
思路:循环遍历需要拷贝的源对象,判断当前属性是否是元素自身 的属性,如果是的接着判断是否是引用类型同时不为null,通过typeof判断,然后根据不同的类型设置不同的接收容器,如果是数组,设置一个数组否则设置对象

  function deepClone(org, target){
        var target = target || {};
        const arrstr = '[object Array]';
        const strcall = Object.prototype.toString;
        for(var key in org ){
            if(org.hasOwnProperty(key)){
                if(typeof org[key] == 'object' && typeof org[key] !== 'null'){
                    target[key] = strcall.call(org[key]) == arrstr ? [] : {};
                    deepClone(org[key], target[key]);
                } else{
                    target[key] = org[key];
                }
            }
        }
        return target;
    }
    let p2 = deepClone(p1);
    p2.son.forth = '4';
    console.log(p1, p2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值