前端面试JS手写题解析系列3——实现满足大部分面试的深克隆
1335
2023.02.11
2023.03.29
发布于 未知归属地

手摸手解析JS手写面试题题系列3——实现满足大部分面试的深克隆

关注程序员耳东,编程转码真轻松

这篇笔记是手摸手解析JS手写面试题的第3篇——实现深克隆方法

上一篇笔记讲了为啥要搞深克隆,毕竟在搞明白怎么做之前,咱们得先搞明白为什么要做,今天这篇笔记就讲讲在JavaScript中如何来实现深克隆以及有哪些实现方法

JSON.parse和JSON.stringify实现

最简单的办法就是使用JSON的相关办法来实现深克隆,代码如下:

image.png

可以看出来我们使用JSON的相关方法确实实现了深克隆,工作中其实大部分情况下,这个方法是够用的,但是这个办法存在缺点:

缺点1:克隆过程中会丢失函数 、RegExp、Date、Set、Map等特殊对象

image.png

可以看出来上面这个例子,在克隆的过程中,丢失掉了run这个方法和reg这个对象的内容

这样肯定是不行的,不能在克隆的过程中损失了我的属性,所以这个办法如果只是克隆这种简单的属性的话还是可以用的,如果涉及到方法和正则对象等等特殊对象,就要谨慎了

缺点2:无法解决循环引用的问题

image.png

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

缺点3:会丢失对象的constructor

image.png

从上面的代码可以看出来,dog1的构造函数是Dog,但是克隆出来的dog2的constructor指向了Object

接下来介绍使用递归的办法来实现深克隆,这是面试的时候比较经典的一个实现方法

递归实现深克隆

所谓递归实现,其实就是这样的,我一层一层的把一个对象的每个属性都复制一遍,如果这个属性是基本类型,那我就直接把它的值赋值一遍,如果是复杂类型,比如对象这种,那我就递归进入这个对象,再把它的属性都复制一遍,这样子就完成了递归的深克隆,最简版的代码如下:

image.png

这个代码其实已经能够应付90%的面试了,但是它还是有一些瑕疵的

如果你精益求精,可以看我的下一篇笔记,我会继续解决深克隆中的这么几个问题:

  1. 循环引用的问题
  2. 克隆函数的问题
  3. 克隆特殊对象的问题
评论 (5)