js中浅拷贝与深拷贝的区别

首先我们需要明白浅拷贝与深拷贝的区别,以下举个例子更好理解一点: 

js中浅拷贝与深拷贝的区别 

当我们定义一个a和b的变量(将a的值定为基本类型),同时将a的值赋值给b。当我们改变a的值时,b的值是不会改变的。

那么当我们给a赋值为引用类型(Object、Array)呢?

js中浅拷贝与深拷贝的区别

可以看到,当a的值为引用类型时,改变a的属性,b也会随之改变。那么,我们既想用到引用类型,又想当a改变时b不改变呢?这个时候就出现了浅拷贝与深拷贝的一个概念。

当a的值为值类型(基本类型)时不存在浅拷贝与深拷贝的区别,都是浅拷贝,分配的空间都是独立不影响的!

当a的值为引用类型时,将a的值赋值给b,其实是将a的地址赋值给了b。所以当a的值改变时,存储地址是没有变的,这就造成了b的值会相应改变。

 

深拷贝就是让b拥有a的值,并且有属于自己的地址,当a的值改变时不影响b的结果。

那么需要怎么实现?以下列举了2种方法:

// 方法一: 通过for-in循环+递归进行实现通过for-in循环+递归进行实现

js中浅拷贝与深拷贝的区别

// 方法二: 通过JSON方法转换实现【此方法缺陷:不会转方法(function(){})!!】

js中浅拷贝与深拷贝的区别