JS之浅拷贝,深拷贝

        浅拷贝和深拷贝是针对数组和对象(Array,Object)这种复杂数据类型来说的。

        浅拷贝指的是只复制了对象中成员变量的标记,也可以理解为只复制了属性名,没有在堆里面开辟新的内存空间,如果B浅拷贝了A,那么如果B的属性值发生了改变,A也会发生改变,因为它们都是指向同一空间地址的。 

var obj = {
            name: '王二狗',
            age: 20,
            arr: [1,2,3,4],
            hobby: {
                game: 'LOL',
                mosic: 'en'
            }
        }
var newObj = obj; // 浅拷贝
newObj.age = 18;
console.log(obj.age); // 18, 当修改新对象的属性值得时候原对象也会发生改变

         深拷贝则是在在堆中开辟了新的内存空间来存放复制的属性值,独立于原来的对象。B深拷贝了A,当B发生改变的时候,A不会变化,因为A和B指向不同的地址。

利用递归的方式实现深拷贝:

        var obj = {
            name: '王二狗',
            age: 20,
            arr: [1,2,3,4],
            hobby: {
                game: 'LOL',
                mosic: 'en'
            }
        }

        // 利用递归实现深拷贝
        function deepCopy(obj, newObj) {
            for (var k in obj) {
                if (obj[k] instanceof Array) {
                    newObj[k] = [];
                    deepCopy(obj[k], newObj[k])    
                } else if (obj[k] instanceof Object) {
                    newObj[k] = {}
                    deepCopy(obj[k], newObj[k])
                } else {
                    newObj[k] = obj[k];
                }
            }
        }
        var newObj = {};
        deepCopy(obj, newObj);
         // 修改newObj的属性值,obj不会发生改变,说明新对象开辟了新的内存空间
        newObj.hobby.game = 'Go'; 
        console.log(obj.hobby.game); // LOL

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值