00:00
哈喽,大家好,那么这个小节我们来做一下升拷贝的终极版本,就是面试加强版二。那这块呢,主要是对于呃,我们三版本当中的这个循环来做一个优化,因为呢,使用for循环效率是比较低的,呃,我们都知道呢,For运循环它不仅能够便利当前对象当中的属性,而且还会去便利。原型对象当中的这个属性。所以说的话,我们可以呢,把这个for循环变成这个for循环或者for循环。好了,那么下边的话,我们开始对代码做一个。这样的改进,首先我们先把这个测试代码先拿过来。啊,第一不可能四。而在左边这个代码呢,我们直接先将第一波三呢先拿过来。优化的点呢,主要在于哪呢?主要是在于。循环这一块。然后呢,我们对这个循环这块做一个不同的情况处理,因为它有两种情况,一种是数组,一种是。
01:00
对象。好了,那接下来的话,我们开始做一下判断。如果。目标数据。为数组。如果,然后ay.is。然后把这个target放进来。然后数组是一个情况,然后对象是一个情况。那么如果是数组怎么办呢?我们就使用for for each循环。啊,来去便利。来一个target.for each。然后这块是item。然后index。大家可以想象一下啊,我们就以这个来为例啊,目标数据是一个数组,我们开始变例,Item就是一,Item就是e fg index就是012。那这个数据我们要往哪存呢?我们要往这个。呃,Result结果里边去存,因为result是我们造出来那个容器,所以应该拿一个result。
02:00
下标index应该等于这个item。但这么写有个问题,为什么?因为item元素它可能是一个基本数据类型,也可能是一个引用数据类型,所以说我们这应该要再去递归调用一下deep。啊,当然我们这忘了改名字了,一会应该是四。Deeper。C4然后呢,值放进来,而且不要忘了把map也要放进来。这样一来的话呢,我们就把数组完成了一个。这样的递归拷贝。好,那如果说是一个对象怎么办?如果是对象。那我们可以这样来做。啊,就是先获取到。这个对象当中。所有的属性。Target。比方说我们以这个C来为例啊,C属性来为例啊,啊,或者说以这个最外层为例,都是一样的,我们先把abcd先拿到。然后呢,怎么办呢?开始便利他写一个for。
03:05
那么此时K的值。啊,或者咱们写一个K吧,不用加S。那K的值。它就是abcd。然后abcd咱往哪儿放呢?咱应该往这个最终的容器当中去放,所以应该是result下边K。等于谁呢?等于一个这个键值,键值是谁呢?他给的是最终那个极,最终咱们这个最最外层那个对象啊K的话呢,是这个属性,所以咱们应该这么写。Target。但是呢,这么写啊,有个问题,它如果是基本数据类型,那没问题,但是如果说是一个数组对象。那就有问题,所以说我们这儿还是得递归去调用一下。低不可来实现一个深拷贝。把这个数据呢,拷贝一下。当然,Map也不能省。这样一来的话呢,我们就啊完成了,完成之后其实这块还有写重的地方,大家看这。
04:06
判断是否为数组这块咱们写重了啊,出于效率的考虑,我们可以这样来做,That is array。等于。把它拿过来。啊,重复代码就不写两遍了啊。然后把它放到这儿。然后呢,把它放这儿。这样的话,检测我们也是只做了一次。判断目标数据的类型。好了,到这的话,整个的便利的一个优化就完成了,如果说是数组就直接使用for,如果是对象的话,就是获取所有的键名。然后呢,再使用佛。好,我们来验证一下,看看效果怎么样,点开它。然后刷新页面,然后点开看这。啊,数据都一样,然后点开BB里边对象点开数组,点开对象点开数组循环引用这块也没有问题。
05:07
好了,那到这儿的话,咱们递归深拷贝啊,它的一个最终版就已经完成了啊,大家以后如果在面试过程当中,让你去做递归深拷贝,你要是能够把这个题啊达到这种程度,那肯定是完全没有问题的。好了,那关于这块内容,我们就先到这儿把它保存一下。
我来说两句