前端/移动开发面试题更新 2026-08-05

请用 JavaScript 编写一个深度拷贝(Deep Copy)函数,以实现对嵌套对象或数组的完全复制。请提供完整的实现代码,并说明其处理边界。

前端/移动开发编码实现风险判断技术原理JavaScript

考察说明

考查对 JavaScript 深拷贝原理的理解以及处理复杂数据结构的编码能力。

回答思路

  1. 【回答框架 1】深拷贝是指创建一个新对象,递归地复制原对象的所有属性,使得新对象与原对象完全独立。常用的实现方式包括递归遍历和利用 JSON 方法,但 JSON 方法有局限性。
  2. 【回答框架 2】实现方案:检查每个值是否为对象,若是数组则递归调用并 push 到新数组,若是普通对象则递归处理键值对;对于基本类型直接返回。需要处理循环引用,可借助 WeakMap 或 Map 记录已访问对象。
  3. 【回答框架 3】还需考虑特殊类型,如 Date、RegExp、Map、Set 等。可以检测并分别处理,例如将 Date 转换为新 Date 实例。函数通常直接引用,不深拷贝。
  4. 【回答框架 4】边界条件包括:null、非对象的基本类型、循环引用、以及不可枚举属性(如 Symbol 属性,可选的完整实现会考虑 Object.getOwnPropertyDescriptors)。
  5. 【关键点 1】递归遍历是深拷贝核心,需区分数组和对象。
  6. 【关键点 2】处理循环引用是必要环节,可使用 WeakMap 记录已拷贝对象,避免栈溢出。
  7. 【关键点 3】JSON.parse(JSON.stringify()) 不能处理函数、Symbol、undefined,且会丢失 Date 等类型。
  8. 【易错点 1】忽略循环引用会导致递归爆栈。
  9. 【易错点 2】直接使用 typeof obj === 'object' 判断可能遗漏 null 或特殊对象导致错误。
  10. 【易错点 3】简单使用 JSON 序列化会丢失函数和特殊类型,不适用于所有场景。