复习:数组与对象的深浅拷贝

本文探讨了JavaScript中数组浅拷贝与深拷贝的区别,通过实例展示了浅拷贝的局限性,并介绍了利用concat、解构赋值和递归实现深拷贝的方法,包括多维数组的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、最简单的浅拷贝:

        let arry = [1,2,3,4,5];

        let arry2 = arry;

        arry[0] = 5;
        arry2[1] = 100;
        console.log(arry,arry2);   //

        

         修改了arry第一个数据后,发现arry2的第一个数据也被改变;

        修改了arry2第一二个数据后,发现arry的第二个数据也被改变;

        浅层次拷贝,数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组,所以这里修改谁,都会直接影响另一个值(es6)

2、利用数组方法完成深拷贝

        a.数组的连接  concat  方法, slice(0)方法,push(),方法详解可以去看一下w3school教程

                let arry = [1,2,3,4,5];

                let arry2 = arry.concat();

                此时再去修改

                arry[0] = 5;

                arry2[1] = 100;

        

                 与第一个浅拷贝的列子不同,哪怕是修改了arry的值,arry2的第一个值也没有变化

                同样的arry2修改了第二个值,arry第二个值没有发生改变。

                   slice是裁剪原数组成为新数组,let 新数组名 = 旧数组.slice(0);就搞定

                    push() 是要用循环调用,遍历数组每一个元素,使之成为新数组

        b.转换法,涉及es6的解构赋值

                 let arry = [1,2,3,4,5];

                 let arry2 = Array.of(...arry);

                let arry3 = [...arry]; 或者 let [...arry3] = arry;

                //将一组值转换为数组,此处存在两层转换,首先解构赋值将数组转换成一个个的参数(可以去了解一下函数与数组的解构赋值应用),传入到Array.of()这个方法中,再由这个方法将这些数值转成新数组,效果是一样的。arry3 深拷贝原理也类似,将atty解构后,重新赋值给arry3,注意数组中括号不能丢.

c.上述方法只能将一维数组进行深拷贝,要想对数组中所有内容都进行深拷贝,就需要使用一下递归,也就是套娃模式。

        

 

附代码,自学随笔记录。

// 多维嵌套的数组(这里是四维)

        let bigArry = [1,2,3,4,[5,6,[7,8],[9,10,[11,12]]],[13,14]];

        // 创建一个函数

        function copyDeep(arry) {

            //新建一个空数组

            let newArry = [];

            //遍历你要拷贝的数组

            for (let i = 0; i < arry.length; i++) {

                if (Array.isArray(arry[i])) {

                    newArry[i] = copyDeep(arry[i])

                } else {

                    // 这个就是子元素不是数组的元素的处理,直接深拷贝一次就行

                    newArry[i] = arry[i];

                }

            }

            return newArry;

        }

        let x = copyDeep(bigArry);

        bigArry[4][2][0] = 1000;

        x[4][2][1] = 99;

        console.log(x, bigArry);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值