什么是深度克隆呢?
在说这个概念前,我们先看几个小例子:
img01
我们列举了三种基本数据类型(Boolean、String、Undefined),可以看到,当我们进行赋值时,没有改变原数据的类型与值。
但是,引用类型是不是也是这样呢?我们一起来看看:
img02
我们发现,当我们将一个对象或数组赋值给另一个变量,在修改这个变量的时候,原来的对象或数组的值也被修改了。为什么会产生这种现象呢?引用类型的赋值跟基本数据类型好像不一致。为了更加深入了解这两种数据类型之间赋值的区别,我们一起来看下图img03:
img03
如上图所示,在JS中数据保存方式有两种,堆内存与栈内存。
JS中的基本数据类型的值保存在栈内存当中,当给它赋值时,其实是创建了一个新的栈内存区,来保存新值;
而堆内存是没有结构的,它保存的是一些复杂的数据,包括数组和对象这种引用类型。
对于引用类型,栈中保存它的变量名与其值在堆中所在地址。每当我们进行赋值操作时,只是将堆中的地址复制了一份传给新的变量。所以,这个新创建的变量与原变量都指向同一块内存空间。当新变量修改值时,原变量的值也被修改。
那对于引用数据类型如何完整复制其内容呢?我们不需要复制地址,我们想复制其值,并保存在另一块内存中,这样,当我们修改变量值时,就不会改变原数据的值。
一起来看代码:
实现深度克隆
A、迭代法,适用于所有
img04
B、JOSN方式,不能复制函数
img05