浅拷贝与深拷贝

浅拷贝 

浅拷贝是对对象的每个属性进行复制,不会递归复制,当我们复制的属性值为对象的时候,实际上只是复制了一个内存地址(因为对象是存储在堆内存中)

var objTem = { a:{w:2},b:2,c:3 }; 

//objTem 是一个对象,b、c属性值都是基本数据类型存储在栈内存中,a属性值({w:2})是对象存储在堆内存中 ,{w:2}里面的w属性值2存储在栈内存中。

function copy(obj){

        var c = obj instanceof Array ? [] : {}  //判断参数是数组还是对象

        for(var key in obj){
                if(obj.hasOwnProperty(key)){ c[key] = obj[key] }

        }

        return c;

}

var objC = copy(objTem)

objC.c=22;

console.log(objTem.c)   //3  不受objC改动影响

//objC对象属性b、c是重新在栈内存划分了一块地址,所以改动objC对象中的c不会影响objTem上的c属性值

objC.a.w = 10;

console.log(objTem.a.w)   //10   objTem对象属性a的w也变化了

//objC对象a属性值是复制了一个指针,指向objTem对象a属性值({w:2})的内存地址,所以objC.a.w=10实际上是修改了a属性值的w属性值2为10

深拷贝  递归复制对象上的每一个属性,并在内存中开辟新的内存地址

var objTem = { a:{w:2},b:2,c:3 }; 

function deepCopy(obj) {

         var c = obj instanceof Array ? [] : {}

        if (typeof obj !== 'object' && obj != null) {

                return obj;

        } else {

                for (var key  in obj) {

                        c[key] = typeof obj[key] === 'object' && obj[key] != null ? deepCopy(obj[key]) : obj[key]

                }

         }

         return c;           

}

var objC = deepCopy(objTem)

objC.a.w = 10;

console.log(objTem.a.w)   //2   objTem对象属性a的w没有变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值