00:00
Hello,大家好,那这个小节我们来实现一下深拷贝啊,先来看一看第一种方式就是大众乞丐版啊,最简单的一种方式来实现深拷贝。这点使用的方式是使用Json的API,可以将数据转化为Json格式字符串。然后再将字符串呢转成数据啊。从而呢实现深拷贝。不过呢,这种方式存在两个问题啊,那么下边的话,我们来给大家做一个实现,顺便演示一下这两个问题。那现在我已经准备好一个数据obj,我们希望对它做一个深拷贝。拷贝。OK的result等于一个deep。一括弧来个obj。然后打印结果。把原来打印一下,再把新的也打印一下。然后呢?接下来我们开始来实现一下这个函数function deep c1。
01:01
里边接收一个参数,就是target。啊,他这个他这个处理方式比较简单啊,首先先将数据。转化为Jason。啊,格式的字符串。说转化不太合适,应该说是。啊,通过这个数据。啊,创建。杰森格式字符串。OK let s DR等于一个接点string。啊,将target。变成这个。Str。我们可以先来看看这个结果。点开浏览器,刷新页面。这边输出有点多啊,我们先把这两个助掉,就先看它。刷斜面。大家看,这已经把它变成了一个字符串了。好变成字符串之后呢,下边第二步。再将。JS的这个字符串。创建为这个GS的对象啊,GS数据。
02:03
Data等于一个杰森。点pass。把str放进来。然后看这个结果。然后打开浏览器刷新。你看,他此时就已经变成一个对象了。啊,变成这样之后呢,咱们再把它做一个返回就搞定。啊,切过来刷新一秒。好,咱们把这两个打开。好,稍息。好,那么此时的话,咱们对比一下啊,这两个数据都是一模一样的。然后咱们为了验证一下它的它它到底是不是一个深拷贝,咱们来修改一下。这个新数据的这个属性值。例如说我们改一下这个C当中H这个属性它的值啊,来一个OBj.c.H等于一个,比如说2万。这样的话就差异性比较大一些,我们来看一看它会不会对原来数据啊缩短,我应该是写result。就用用新数据去改完之后看看原数据这块到底有没有发生改变。
03:03
切过来右键刷新。我们点开原始数据,你看这儿它还是20啊,跟这个新数据之间呢,没有任何的影响。所以说呢,由此可证它是一个深拷贝。不过呢,这种拷贝方式呢,有两个问题。第一个问题呢,我来说一下,就是它呢不能去克隆。函数类型的属性。啊,也就是不能克隆方法。结实呢,不能克隆。方法。举个例子,比如说我这写个D。后边呢,咱们写一个。函数。我们来看一看他们克隆之后的一个结果。右键刷新。大家看这,那么你会发现新克隆出来这个对象,它没有D这个属性啊,没有这个方法。啊,这是第一个问题,第二个问题呢,就是循环引用的问题。循环引用。我们来举个例子,比如说OB间点B。
04:01
啊,就是说这个数组。我把C的值压到这个数组里边去。点。Push。然后把C带进来。然后呢,我们再把B呢放到C这个对象里边。来一个OBj.C。点。比方说我们在这再加一个啊来一个,来一个接啊来一个接,然后等于谁呢?等于一个OBj.B。来看一下啊,我们是把C。放到了B的数组里边。然后又把B这个值放在了C当中的一个属性叫阶当中。好,这样的话就形成了循环引用啊,B里边这个值引用了CC里边也引用了B。对于这种情况,我们来看看他到底能不能成功啊,右键刷新一下。啊,他说C没有定义啊,不是这个报错啊,应该是谁呢?应该是OB接点C。好了,我们再来看看效果怎么样,刷新一遍。
05:01
再看这啊,Type error啊,Converting,什么calc structure to Jason啊,它这块对于循环引用的问题的话,它是不能够去帮我们实现深拷贝的。就是使用杰森方式实现参口碑的一个特点啊。方便是方便,但是呢,也是有一些缺陷的啊,第一个它不能克隆方法,第二个对于循环引用问题,它不能很好的解决。好了,关于深拷贝的第一种方式,我们就先说这么多。
我来说两句