实现一个函数 deepClone(obj),深拷贝一个对象

推荐答案

-- -------------------- ---- -------
-------- -------------- -
  -- ---- --- ---- -- ------ --- --- --------- -
    ------ ----
  -

  -- ---- ---------- ----- -
    ------ --- --------------------
  -

  -- ---- ---------- ------- -
    ------ --- ------------
  -

  -- -------------------- -
    ----- ------- - ---
    --- ---- - - -- - - ----------- ---- -
      ---------- - ------------------
    -
    ------ --------
  -

  ----- ------- - ---
  --- ------ --- -- ---- -
    -- ------------------------- -
      ------------ - --------------------
    -
  -

  ------ --------
-

本题详细解读

1. 基本思路

深拷贝的核心思想是递归地复制对象的所有属性,包括嵌套的对象和数组。我们需要处理以下几种情况:

  • 基本类型(如 number, string, boolean 等):直接返回。
  • nullundefined:直接返回。
  • Date 对象:创建一个新的 Date 对象,复制时间戳。
  • RegExp 对象:创建一个新的 RegExp 对象,复制正则表达式。
  • 数组:递归地复制数组中的每个元素。
  • 对象:递归地复制对象的每个属性。

2. 代码解析

  • 基本类型和 null 检查:如果 obj 是基本类型或 null,直接返回 obj
  • Date 对象处理:如果 objDate 对象,创建一个新的 Date 对象并复制时间戳。
  • RegExp 对象处理:如果 objRegExp 对象,创建一个新的 RegExp 对象并复制正则表达式。
  • 数组处理:如果 obj 是数组,创建一个新数组,并递归地复制每个元素。
  • 对象处理:如果 obj 是对象,创建一个新对象,并递归地复制每个属性。

3. 注意事项

  • 循环引用:这个实现没有处理循环引用的情况。如果对象中存在循环引用,会导致无限递归。可以通过使用 WeakMap 来存储已经拷贝过的对象来解决这个问题。
  • 性能:深拷贝是一个相对耗时的操作,尤其是在处理大型对象时。在实际应用中,应尽量避免不必要的深拷贝。

4. 扩展

  • 处理循环引用:可以通过引入 WeakMap 来存储已经拷贝过的对象,避免无限递归。
  • 处理更多类型:可以根据需要扩展 deepClone 函数,支持更多类型的深拷贝,如 MapSet 等。
纠错
反馈