JavaScript之深拷贝,浅拷贝
概念
简单来理解就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。
深入理解浅拷贝
首先,举个例子,代码如下:
var a=[0,1,2,3,4,5],
b=a;
console.log(a===b);
a[0]=1;
console.log(a,b);
根据这个例子可以看出b复制了a的内容,b随着a的变化而变化,这就是浅拷贝。
深入理解深拷贝
通过堆栈存储更好理解深拷贝
首先建立一个数组a,分配的栈内存如下:
b对a进行复制,栈内存会新开辟一个内存:
当修改a的某个值时,对b并不会造成影响,虽然b不受a影响,但这也算不上深拷贝,因为深拷贝本身只针对较为复杂的object类型数据。
引用数据类型–名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值
当b对a进行拷贝时,其实复制的是a的引用地址,并非不是堆里面的值。
当a数组进行修改时,由于a与b指向的是同一个地址,所以b也受了影响,这就是所谓的浅拷贝。
而要到达深拷贝,就要让b重新开辟一个堆内存
这就实现了深拷贝