我们在项目中,经常会用到赋值,其中基本数据类型(Undefined、Boolean、Number、String、Null)的赋值都是开辟了新的空间存储拷贝的值,所以不存在深拷贝和浅拷贝。今天我们主要说的是对象和数组的深拷贝和浅拷贝。
理解深拷贝和浅拷贝,以及为什么要分深拷贝和浅拷贝。
我们在做项目的时候,会遇到这种情况,将一个对象或数组A赋值给对象或数组B,B = A,这时候,我们在后面操作B时,改变了B,这时候,你会发现A也被改变了,这就是浅拷贝。然而实际项目中我们只想改变B但是A又要保持不变,这时候就要用到深拷贝了。说白了,两种拷贝的初衷都是在改变指针的指向。
对象的深拷贝:
我们知道了,浅拷贝其实只要运用“=”号就可以了,那深拷贝应该怎么做呢,请看以下代码:
这种方法比较笨,需要将a对象的数值一个个复制出来放到b的内存中,所以,我们换种思路,这其实就是遍历的问题:
数组的深拷贝:
首先我们先看一个比较暴力的方法,那就是遍历,然后赋值:
这种方法不太提倡,因为很多简单的方法都能进行数组深拷贝,比如slice或者concat:
最后:当然对象或数组的深拷贝还有很多种方法,比如es6中新增的方法Object.assign和jQuery的$.extend等等