对concat和slice是深拷贝还是浅拷贝的解答

concat和slice都是对数组的拷贝,具体是怎么进行拷贝的我们在这里不进行详细的说明了,如果不知道大家可以自己去理解,今天是关于我对这两个数组是深拷贝还是浅拷贝进行分析:

一.深拷贝和浅拷贝

如何对深拷贝和浅拷贝进行区分呢,举个简单的栗子,假设A复制了B,将B的值进行修改,看A的值的变化,如果A的值发生了改变,说明是浅拷贝,如果A的值没有变化就是深拷贝,浅拷贝就是拷贝了内存,当改变了一个指针指向的值时,另外的也发生了变化,而深拷贝是开辟了一个独立的内存,指针指向的值变化是,另一个内存中的值没有变化。


看到这个例子后我就觉得这个concat不是深拷贝嘛,怎么变成了浅拷贝,然而大家可能忽略了一点,深拷贝和浅拷贝处理的是引用数据类型,而不是这个基本数据类型。

二.基本数据类型和引用数据类型

基本数据类型:名值存储在栈内存中;

引用数据类型:名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值。


像这样,concat过后,处理的是a数据的第一项也是个数组,是引用数据类型,所以最终b数组也发生了变化,自此,其实concat是浅拷贝,并不是深拷贝。但是又有一个问题,请看下个例子:


上面也是对引用数据类型的处理,为什么还是不变呢?

原因就是我将a[0]存储的指针变了,而b[0]的指针没有变,这是直接替换了指针,并不是通过指针修改数据。简单的说引用数据类型的地址和值不存在一起,而是通过指针从地址指向值,a[0]变化了,就是指针的指向变了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容