天天看点

JavaScript之深拷贝,浅拷贝

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);
           
JavaScript之深拷贝,浅拷贝

根据这个例子可以看出b复制了a的内容,b随着a的变化而变化,这就是浅拷贝。

深入理解深拷贝

通过堆栈存储更好理解深拷贝

首先建立一个数组a,分配的栈内存如下:

JavaScript之深拷贝,浅拷贝

b对a进行复制,栈内存会新开辟一个内存:

JavaScript之深拷贝,浅拷贝

当修改a的某个值时,对b并不会造成影响,虽然b不受a影响,但这也算不上深拷贝,因为深拷贝本身只针对较为复杂的object类型数据。

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

JavaScript之深拷贝,浅拷贝

当b对a进行拷贝时,其实复制的是a的引用地址,并非不是堆里面的值。

JavaScript之深拷贝,浅拷贝

当a数组进行修改时,由于a与b指向的是同一个地址,所以b也受了影响,这就是所谓的浅拷贝。

JavaScript之深拷贝,浅拷贝

而要到达深拷贝,就要让b重新开辟一个堆内存

JavaScript之深拷贝,浅拷贝

这就实现了深拷贝

继续阅读