concat和slice都是对数组的拷贝,具体是怎么进行拷贝的我们在这里不进行详细的说明了,如果不知道大家可以自己去理解,今天是关于我对这两个数组是深拷贝还是浅拷贝进行分析:
一.深拷贝和浅拷贝
如何对深拷贝和浅拷贝进行区分呢,举个简单的栗子,假设A复制了B,将B的值进行修改,看A的值的变化,如果A的值发生了改变,说明是浅拷贝,如果A的值没有变化就是深拷贝,浅拷贝就是拷贝了内存,当改变了一个指针指向的值时,另外的也发生了变化,而深拷贝是开辟了一个独立的内存,指针指向的值变化是,另一个内存中的值没有变化。

看到这个例子后我就觉得这个concat不是深拷贝嘛,怎么变成了浅拷贝,然而大家可能忽略了一点,深拷贝和浅拷贝处理的是引用数据类型,而不是这个基本数据类型。
二.基本数据类型和引用数据类型
基本数据类型:名值存储在栈内存中;
引用数据类型:名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值。

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

上面也是对引用数据类型的处理,为什么还是不变呢?
原因就是我将a[0]存储的指针变了,而b[0]的指针没有变,这是直接替换了指针,并不是通过指针修改数据。简单的说引用数据类型的地址和值不存在一起,而是通过指针从地址指向值,a[0]变化了,就是指针的指向变了。
网友评论