马小看前端( 深拷贝与浅拷贝的基础 )
深拷贝与浅拷贝的基本理解(这个讲的是重点,一定要标记)
** 深拷贝与浅拷贝我相信大家应该不会陌生,因为平常在我们最基本的面试中经常可以遇到这样的问题,用简单点来说也就是B与A俩个人,当我们尝试去修改A时我们可以看看B是否会发生变化,如果发生了变化那么这个就说明了是一个浅拷贝,那么深拷贝,我想在这里不难猜到了吧,如果B的值没有去发生变化的时候那么这个就是深拷贝,自食其力不靠其他人(敲编程也是一样不能太过依赖他人,学会自己学习)**
那么到这里的话最基本的深拷贝与浅拷贝就理解基本了(下面我们来直接操作)
let a=[0,1,2,3,4],
b=a;
console.log(a===b);
a[0]=1;
console.log(a,b)
这样会打印出来说明结果呢,又说明了说明呢?
那么下面我来讲讲上面代码的主要的作用,其实不难看出这个就是一个最简单的浅拷贝,明明复制了b为什么会修改a ,那么这里呢在去普及一个知识点,也就是基本数据类型与引用数据类型,在我以前去面试的时候面试官会经常去问这个东西,谈谈基本类型和引用数据类型,基本数据类型有number,string,boolean,null,undefined,引用数据类型常有无序对象{a:1},数组[1,2],以及函数等
这样说了以后很多人不了解这俩种类型那么下面我们来谈谈(基本类型)
谈到这里呢我们一定要开始往脑子里装东西了,那么根据上面的代码,我们来分析一下,基本的数据类型名和值是全部存到栈内存中去,而我们去复制a里面的内容时,那么b就会在栈内存中开辟一个新的空间
引用数据类型
引用数据类型呢就是说名字存到了栈内存中但是它的值存到了堆内存中,但是要记住栈内存中一定会产生一个地址指向堆内存中的值,当b去拷贝a时,其实它去复制的时a的引用地址,而并非堆内存的值,当我们在拷贝时也专门开辟一个存放b值的地址的时候,那么这个时候我们去修改a里面的值,那么这样的话它去修改的就是在栈内存中a的地址里面的值,所以这个时候b就不会改变,那么这个就是我们所理解的深拷贝
其实吧深拷贝时用递归来实现的,那么你们了解递归吗?
如果不了解递归去实现一个深拷贝的话那么请听我下节继续讲解,今天就在这里打个问号?明天继续更,准备写项目了
今天的深拷贝与浅拷贝就到这里,下一章我会继续更新完深拷贝与浅拷贝的具体用法