前几天面试,笔试时有道题是要自己写一个例子实现深拷贝,顿时懵逼了。深拷贝也不是没接触过,只是以前实际项目中没有运用,后来就只记得有这么个概念,更没有深究其原理。现在我来说说我对js深拷贝最新的理解。
js数据类型存储方式
基本类型:undefined,null,Boolean,Number和String,这些类型分别在内存中占有固定的大小空间,它们的值保存在栈空间,我们通过按值来访问的。
引用类型:对象、数组、函数等。对于引用类型的值,则必须在堆内存中为这个值分配空间。由于引用类型值的大小不固定(对象有很多属性和方法,而且还可以动态的添加属性和方法),因此不能把他们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中。
简而言之:栈内存中存放的是基本数据类型值,堆内存中存放的是引用类型值,引用类型值在内存中的地址存放在栈中,也就是我们常说的对象对象引用(指针)。
浅拷贝
浅拷贝就是将值简单的赋给其他变量,用来备份数据,但很多时候,会得到不是我们想要得到的结果,让我们来看下面这段代码:
从上面例子可以看出:在变量复制方面,基本类型和引用类型有所不同,基本类型复制的是值本身,而引用类型复制的是内存地址,如果有一个对象值变化了,另一个也会跟着变化。
深拷贝
所谓”深拷贝”,就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用”浅拷贝”就行了。
这样就实现数组和对象的深拷贝。
很简单吧,赶快试一试哦!