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

在 JavaScript 中,实现对象浅拷贝和深拷贝分别有哪些常用方式?请说明各自的实现原理、适用场景及可能存在的问题。

前端/移动开发技术原理方案权衡JavaScript

考察说明

考查对 JavaScript 中对象拷贝基础概念、常用方法及内部机制的理解。

回答思路

  1. 【回答框架 1】浅拷贝是复制对象引用,新对象改变基本类型属性时原对象不受影响,但修改引用类型属性时原对象会同步变化。常用方式包括 Object.assign、扩展运算符...,以及手动遍历 for...in 并忽略原型链属性。
  2. 【回答框架 2】深拷贝是生成全新且完全独立的对象,递归复制所有嵌套属性。常用方式包括 JSON.parse(JSON.stringify(obj)),但会忽略函数、Symbol、undefined 以及循环引用,并且 Date、RegExp 等特殊对象会被转成字符串或空对象。
  3. 【回答框架 3】手写递归深拷贝需要考虑类型判断,对数组、普通对象、Date、RegExp 等分别处理,并使用 WeakMap 解决循环引用问题。除此之外,结构化克隆算法(如 MessageChannel、history.replaceState、Notification)也能实现浏览器中的深拷贝。
  4. 【回答框架 4】现代 JavaScript 标准库中,可调用 structuredClone 方法实现深拷贝,它基于结构化克隆算法,支持绝大多数类型,但会忽略函数和 Symbol。在选择拷贝方式时,需依据数据是否包含函数、Symbol、循环引用以及性能要求。
  5. 【回答框架 5】在实际项目中,浅拷贝用于仅需独立基本类型属性的场景,深拷贝用于避免因嵌套对象共享引用而导致的意外修改。注意不可变数据结构常用浅拷贝或结构性共享来提升性能。
  6. 【关键点 1】浅拷贝常用 Object.assign 与扩展运算符,二者仅复制一层属性,嵌套对象仍共享引用。
  7. 【关键点 2】JSON 序列化实现深拷贝有局限性:忽略函数、Symbol、undefined,无法处理循环引用,且特殊对象会被转换。
  8. 【关键点 3】手写递归深拷贝应使用 WeakMap 缓存已拷贝对象以解决循环引用。
  9. 【关键点 4】结构化克隆算法(如 structuredClone)是浏览器原生深拷贝方案,但不保留函数与 Symbol。
  10. 【关键点 5】深拷贝性能与对象深度和大小相关,大数据量时需评估内存与时间开销,必要时考虑结构性共享。
  11. 【易错点 1】不能无条件使用 JSON 序列化进行深拷贝,忽略函数和循环引用会导致数据丢失或抛出异常。
  12. 【易错点 2】浅拷贝并不等于不可变,嵌套对象仍可被修改,常见误区是误以为拷贝后所有新对象完全独立。
  13. 【易错点 3】手写递归深拷贝易忽略特殊类型(Date、RegExp、Map、Set)或原型链属性,导致拷贝不完整。