推荐答案
-- -------------------- ---- ------- -------- -------------- - -- ---- --- ---- -- ------ --- --- --------- - ------ ---- - -- ---- ---------- ----- - ------ --- -------------------- - -- ---- ---------- ------- - ------ --- ------------ - -- -------------------- - ----- ------- - --- --- ---- - - -- - - ----------- ---- - ---------- - ------------------ - ------ -------- - ----- ------- - --- --- ------ --- -- ---- - -- ------------------------- - ------------ - -------------------- - - ------ -------- -
本题详细解读
1. 基本思路
深拷贝的核心思想是递归地复制对象的所有属性,包括嵌套的对象和数组。我们需要处理以下几种情况:
- 基本类型(如
number
,string
,boolean
等):直接返回。 null
和undefined
:直接返回。Date
对象:创建一个新的Date
对象,复制时间戳。RegExp
对象:创建一个新的RegExp
对象,复制正则表达式。- 数组:递归地复制数组中的每个元素。
- 对象:递归地复制对象的每个属性。
2. 代码解析
- 基本类型和
null
检查:如果obj
是基本类型或null
,直接返回obj
。 Date
对象处理:如果obj
是Date
对象,创建一个新的Date
对象并复制时间戳。RegExp
对象处理:如果obj
是RegExp
对象,创建一个新的RegExp
对象并复制正则表达式。- 数组处理:如果
obj
是数组,创建一个新数组,并递归地复制每个元素。 - 对象处理:如果
obj
是对象,创建一个新对象,并递归地复制每个属性。
3. 注意事项
- 循环引用:这个实现没有处理循环引用的情况。如果对象中存在循环引用,会导致无限递归。可以通过使用
WeakMap
来存储已经拷贝过的对象来解决这个问题。 - 性能:深拷贝是一个相对耗时的操作,尤其是在处理大型对象时。在实际应用中,应尽量避免不必要的深拷贝。
4. 扩展
- 处理循环引用:可以通过引入
WeakMap
来存储已经拷贝过的对象,避免无限递归。 - 处理更多类型:可以根据需要扩展
deepClone
函数,支持更多类型的深拷贝,如Map
、Set
等。