00:00
Hello,大家好,那这个小题呢,我们来学习一下数据拷贝。啊,分为两种,一种是浅拷贝,一种是深拷贝。什么是拷贝呢?拷贝其实就是复制。啊,就是对数据做一个复制,那么深拷贝与全拷贝有什么区别呢?它们的区别主要在于我们拷贝出来的这个数据,就是复制出来这个数据。假如说这是旧的,这是新的。假如说我们对这个新的数据做修改。它会不会影响原来数据。如果说它影响了原来数据,那么这种拷贝我们把它称之为是前拷贝。假如说呢,这个数据拷贝出来之后,我无论如何去做修改,都不会影响原来数据啊,这种拷贝我们把它称之为是深拷贝。为什么会出现前拷贝呢?啊,我们先简单解释一下,就是因为呢,在GS里边它有引用数据类型啊,例如数组,例如对象。
01:00
对于这样的数据,在进行赋值的时候,它赋值的是地址。就很有可能会出现这种情况。A对象。B对象。他们两个都有一个属性,而这个属性值。换个颜色啊。它们的属性值。是同一个对象。比方说原来这个属性指向这个对象,而我现在这个B对象copy出来之后呢,我拿到的是地址,而不是值。那这样的话呢,如果我对B对象该属性进行修改的话。比如说我把这个属性改成了A等于200,原来是100。那原来对象他去获取这个属性时,它的值就变成200而不是100了。在这种情况下就会出现啊前拷贝的情况。那好,那下边的话我们就来呃给大家实现一下啊,第一种前拷贝的这种方式,我们借助于ES6的扩展运算符来实现。好,那么首先的话,我们先把结构先搭一下。
02:03
啊,大家可以看一下啊,这这个呢是一个对象。然后呢,我调用C1这个函数,然后得到一个新对象啊,然后打印它,当然我们到最后还要去做一些测验啊,我们先看看能不能把它先克隆出来。OK,那咱们写一个。函数,然后在里边写一个变量。啊,行参苏瑞啊。这块呢,它是一个任意类型,你可以写。基本数列型可以写数字,写字符串,当然你也你也可以去写对象和数组。啊,不过呢,对于基本数据类型的话,我们就直接返回它的一个值了,比如说你这写这个一,那我就给你返回一,你要写字符串I loveyou,那我就给你返回I love you。好,所以咱们这需要对这个数据做一个类型判断。法类型判断。啊,判断他到底是不是谁呀,一个对象。如果是,如果说你是一个对象,那你就可以进来,如果说你不是一个对象的话,你就别进来。
03:04
We over的情况有哪些呢?你比如说咱们的对象啊,再比如说咱们的数组,他们都可以进来。当然了,其实还有一个东西也能进来谁啊,就是null它也能进来,对于对于这种数据怎么咱们克隆是没有意义的,所以说呢,我们这样子。加一个判断。啊,Target还不等于这个nu。你满足这个条件就可以进到我们代码段里边来,如果说呢,你这块不满足啊,不满足这个条件,那好我就直接return一下target。那在里边如果说是一个数组,如果说是一个对象怎么办呢?对于这两种情况,我们还要分开去处理。好,我们来判断一下。判断数据是否为数组。如果说ay.isay。他如果说是一个数组。
04:00
一种情况,如果说不是数组,是对象,是另外一种情况。那好,如果是数组怎么办呢?哎,如果是数组的话,我们就可以这样来做。点点点target。扩展运算符,我呢为你创建一个新数组,然后把内容展开放到这个新数组里边。如果是对象怎么办呢?哎,对象的话,我就用花括号点点点。把你展开。啊,形成一个新的对象。我们来看看这个效果。好,然后呢,咱们点开浏览器。打开它刷新一面,他说cloe is notified啊,在这的话,我们并没有去引入文件,把它加一下啊,Src。点点杠sc object,然后。好,切过来,刷新页面。克隆一还是没有,诶克隆一。啊,这块的话我们写错了,我们应该是写C。好切过来刷新一面,大家可以看一下,然后呢X,然后呢Y。
05:03
XABCY呢,MM冒号一啊,可以看一下两个的值是一样的,下面呢,我们来测试一下。怎么来测试呢?我们可以这样来做。修改这个新数据。中某个引用类型的值。啊,比方说我现在把这个M的值改成个二,怎么改呢?result.y点等于一个二。啊,然后呢,改完之后咱们来看一看这两个数据。啊,这是。呃,原来数据一个呢,是新数据呢,我们来看看效果怎么样啊,切过来右键刷新。大家可以看一下啊,点看这。啊,这是咱们的旧数据,能看到吧,Obj是旧数据啊,你会发现我们对新的对象做了属性修改,但是呢,原来数据他们发生了改变。啊,然后当然你再看看这个新的它呢,这块也是二。
06:03
由此可证呢,这种拷贝呢,它是一种浅拷贝。也就是说这个对象。我们在进行copy的时候,对于Y这个属性值。我们copy的时候呢,其实是copy它的一个地址。那么这个值呢,它指向这个地值,而这个复制出来这个结果呢,它也指向这个地值。啊,当我们对这个值做修改的时候啊,比方说这我们改了啊,用新对象去改了,改成一个M等于一个二,那原数据再去获取的时候,这个值已经发生改变了。所以这种拷贝我把它称之为是前拷贝。好了,那关于这个前拷贝的实现,我们就先到这儿把它先保存一下。
我来说两句