关注程序员耳东,编程转码真轻松
这篇笔记是手摸手解析JS手写面试题的第3篇——实现深克隆方法
上一篇笔记讲了为啥要搞深克隆,毕竟在搞明白怎么做之前,咱们得先搞明白为什么要做,今天这篇笔记就讲讲在JavaScript中如何来实现深克隆以及有哪些实现方法
最简单的办法就是使用JSON的相关办法来实现深克隆,代码如下:

可以看出来我们使用JSON的相关方法确实实现了深克隆,工作中其实大部分情况下,这个方法是够用的,但是这个办法存在缺点:
缺点1:克隆过程中会丢失函数 、RegExp、Date、Set、Map等特殊对象

可以看出来上面这个例子,在克隆的过程中,丢失掉了run这个方法和reg这个对象的内容
这样肯定是不行的,不能在克隆的过程中损失了我的属性,所以这个办法如果只是克隆这种简单的属性的话还是可以用的,如果涉及到方法和正则对象等等特殊对象,就要谨慎了
缺点2:无法解决循环引用的问题

上面这个例子,obj5有个属性link又指向了obj5自身,这就叫循环引用,在克隆的过程中就会导致代码直接报错
缺点3:会丢失对象的constructor

从上面的代码可以看出来,dog1的构造函数是Dog,但是克隆出来的dog2的constructor指向了Object
接下来介绍使用递归的办法来实现深克隆,这是面试的时候比较经典的一个实现方法
所谓递归实现,其实就是这样的,我一层一层的把一个对象的每个属性都复制一遍,如果这个属性是基本类型,那我就直接把它的值赋值一遍,如果是复杂类型,比如对象这种,那我就递归进入这个对象,再把它的属性都复制一遍,这样子就完成了递归的深克隆,最简版的代码如下:

这个代码其实已经能够应付90%的面试了,但是它还是有一些瑕疵的,
如果你精益求精,可以看我的下一篇笔记,我会继续解决深克隆中的这么几个问题: