00:00
Hello,大家好,那这个小型呢,我们接着来做声拷贝啊,这次呢,我们换一种方式来去实现,那就是使用递归的方式来实现这个声拷贝。好了,我们废话不多说啊,直接开始进入正题,来一个递归。什么是递归拷贝呢?就是如如果说啊,我们先去复制第一层啊,如果发现呢,它的数据依然是一个数组或者对象,我们接着去拷贝啊,是这样的一个思路。好了,还是一样,我们先写一个测试代码,写一个deep。C来一个二。然后把这个obj放进来。然后打印一下整个的结果obj。以及这个result。好了,接下来的话呢,我们开始来写代码。Deep克隆二。也是有一个数据targets。在这呢,我们还是要按照老套路来做一下,那就是要先检测一下数据的这个类型。
01:00
啊,如果说target。啊,他呢?The type of值。等于一个谁object。并且。这个target它还不等于。Now。不流量的话,那么你就可以进来啊去进行啊递归深拷贝,那如果说呢,你不属于这两种情,不属于这个情况,是属于其他情况,比如说你是一个基本数据类型是数字。字符串,那对不起啊,直接return他给他。大家注意啊,这个代码是必须要加的啊,如果不加的话,递归在在递归的时候它是实现不了效果的。那好,接下来我们怎么办呢?我们接下来接着去操作,那就是首先要先创建一个容器。其实这块我们之前做过。定义一下,这个result应该等于a.is ara。Target,如果说你要是一个数组。
02:02
那好啊,我就给你来一个中括号,如果说你不是一个数组,你是一个对象啊,那好,我就来一个花括号。先去把这个容器造出来。容器再造出来之后呢?接下来我们开始对这个对象做一个便利。便利对象。怎么来辨利对象呢?我们可以使用for in循环来做啊,Let k,然后呢,In obj。还是老套路啊,我们要检测该属性。是否?为对象本身的属性。也就是说不能去。拷贝原型对象上面的属性。好,然后呢,判断一下,如果说obj啊。点啊,所以应该是。咱们这不应该写OG啊,这应该写target。然后呢,如果说target has on property。啊,把K放进来。如果有的话,我们就开始呢进行拷贝。
03:03
我们开始进行拷贝,拷贝呢,你就直接往这个result身上去放就行了,Result下边K。然后就应该等于。等于谁呢啊,比如说啊,我们现在是第一次进来,第一次进来的话就应该是K的话就应该是A。对吧,它它应该是A,然后呢,这块是满足条件的,因为A是存在的。然后呢,我们需要把A往哪放呢?往result身上去放。啊,怎么放呢?那就是把KA往他往他身上去加,值是谁呢?值应该就是这个target。下标K。但是目前我们不能这么去做啊,为什么呢?因为如果这么去做的话,第一个一它好使,但是第二个数组,第三个对象就不好使了。因为他们是引用类型数据,所以直接赋值的话会出问题。所以说我们这应该怎么办呢,递归灯。Deep。那为什么这样去做就能够拿到这个结果呢?当然目前还不能拿到结果啊,我们最后还要做做一个返回,Return一下result。
04:04
我们来分析一下,你看第一次一啊,我们把一传进去。就是把一呢传进来,把一传进来之后呢,调用这个第一步的时候呢,它因为不是一个对象,所以直接返回一了,就造了一个一模一样的这个数字回来,然后给了他。所以在result当中呢,就有了A这个属性,并且它的值是一。那好,进入第二次循环。第二次情况的话呢,这个K的值是B。然后呢,Target k的值呢,是这个数组。大家可以看一下,此时它的值是这个。然后呢?接下来开始deep c这个数组。然后呢,进到这个函数当中来,再次进来,因为它呢又是满足条件的,所以又创建一个新的容器,注意这是在另外一个上下文当中。啊,跟上面那个是不太,呃,是不冲突的啊。好,那么此时的话,我们现在是在克隆谁呀?克隆这个数组。创建一个新的容器。
05:01
然后佛性循环遍历这个数组。便利的时候呢,检测里边有没有,哎,有的话啊,开始进行啊这个克隆。注意我们在变列的时候呢,第一次是谁啊?第一次是零,第二次是一,第二次是二,然后呢,这个时候他给的K的值就变成了EFG的。所以说呢,在第一步可能的时候,它能够准确把这个值呢,再次的重新复原。最后伪造的结果是谁呢?伪造结果是跟这个数组一模一样的一个结果数组。那么这样的话呢,我们就把这个值复制完毕,并且把它放到了最外层我们result当中的这个B属性当中。啊,所以说通过这种方式,我们就可以完成深拷贝。好,我们可以先来测验一下,看它好使不好使。啊,切过来,点开它右键刷新。可以来看一看。这块结果是一样的,当然我们还要做一个测试,看它是不是升口碑result.c。
06:01
点H等于个200。看看原数据到底有没有发生改变啊,然后点开看,这还是20。然后你看这儿它是2万。啊,他们两者之间没有任何影响,所以这个是一个声拷贝。呃,并且呢,通过这种方式,我们解决的第一个问题,那就是呃,方法的复制也是可以的,你可以看一下D,我们也是成功的把它拿了过来。但是呢,有一个问题还是没有解决,谁呢?就是循环引用这个问题。依然是没有解决。拿过来。然后咱们点开一起来看一看,刷新页面啊。这个时候的话会就是。呃,递归的话就直接溢出了。啊,因为一直它是是数组,然后是对象,然后判断数组对象,数对象没有头。所以说的话呢,这种方式它还不是最终版。啊,它还不能够解决这个循环用的问题。
07:00
好了,那第二个阶段啊,就是咱们基础版的这种。递归生拷贝咱们就已经完成了。
我来说两句