引用类型的深拷贝与浅拷贝

什么是深拷贝与浅拷贝

我们都知道在Js当中数据类型是分为基本数据类型和引用数据类型,基本数据类型有Number、String 、Boolean、Null、Undefined这里就不一一细说了,我们今天主要来说说引用类型的深拷贝与浅拷贝问题,引用类型Object,主要又分为对象{},和数组[]。
在这里我们又要引入一个知识点,就是栈内存跟堆内存,基本数据类型都是存储在栈内存中的,而引用类型都是存储在堆内存中的,看图
在这里插入图片描述
在这里插入图片描述
如图所示,栈内存拷贝之后是重新开辟了一个存储空间,而堆内存拷贝则是相当于给予了一个通为堆内存的链接地址,两则之间的内容还是有联系的,如果改变一个值,另一个值也会改变,这样会带来许多不便,这时候我们就需要用深拷贝和浅拷贝这个两个词来解决这个问题。
1、浅拷贝
什么是深拷贝与浅拷贝,简单来讲浅拷贝是只能实现一维数组的拷贝,比如arr=[1,2,3,4,5,6],但是对二维或者多维数组就不行,比如arr=[1,[2,3,4],5,6,7],浅拷贝就不能让数组里的数组[2,3,4]改变两者不影响,而深拷贝就能实现。

var arr1 = [1,2,3,4,5,6,7];
    var arr2 = [];
    for (var j = 0;j<arr1.length;j++){
        arr2.push(arr1[j])
    }
    console.log(arr2);//[1, 2, 3, 4, 5, 6, 7]

关于浅拷贝如以上代码所示一个简单的for循环就能够实现。

2、深拷贝
实现深拷贝可以套用for循环然后不断递归来实现

function fm(arrx) {
        var arry =[];
        for (var k = 0;k<arrx.length;k++){
            if (typeof arrx[k]==="object"){
                arry[k]=new Array();
                arry[k] = fm(arrx[k])
            }else {
                arry[k] = arrx[k];
            }

        }
        return arry
    }
    var arrx = [[1,2,3],4,5,6,[7,8,[8,8,9]]];
    var arr1122 = fm(arrx);

    arrx[4][2][0]="ddd";
    console.log(arrx);//1,2,3,4,5,6,7,8,ddd,8,9
    console.log(arr1122);//1,2,3,4,5,6,7,8,8,8,9

还有的就是用Json来实现

 arr1 = [[1,2,3],4,5,6,[7,8,[8,8,9]]];
    var arrN = JSON.parse(JSON.stringify(arr1));

这样arrN就重新生成了新的数组了。
还有一种就是用数组的slice的方法

var arr2 =[2,3,1,53,2,5];
    var arr3 = arr2.slice(0);

通过切片的方式,arr3生成了一个新数组,数组就是arr2里的内容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值