深拷贝和浅拷贝的区别在于:浅拷贝只复制对象的第一层属性,嵌套对象仍共享引用;深拷贝则递归复制所有层级,新对象与原对象完全独立。浅拷贝常用展开运算符、Object.assign()、slice()等,仅复制首层;深拷贝可用JSON.parse(JSON.stringify())(有类型限制)、structuredClone(现代原生支持复杂类型及循环引用)或递归实现(需处理循环引用、特殊类型等)。

深拷贝和浅拷贝的区别在于:浅拷贝只复制对象的第一层属性,嵌套对象仍共享引用;深拷贝则递归复制所有层级,新对象与原对象完全独立。
浅拷贝的常见实现方式
适用于只有一层结构的对象或数组,简单快速,但无法处理嵌套数据。
-
展开运算符(...):适合对象和数组,如
const newObj = {...oldObj}或const newArr = [...oldArr] -
Object.assign():仅用于对象,
Object.assign({}, oldObj),注意它不处理 null/undefined 源对象 -
Array.prototype.slice() / concat():仅限数组,
arr.slice()或[].concat(arr)
深拷贝的实用方法
需要真正隔离数据时使用,尤其涉及多层嵌套、修改不影响原数据的场景。
-
JSON 序列化反序列化:
JSON.parse(JSON.stringify(obj)),简单但有明显限制——不能处理函数、undefined、Symbol、Date、RegExp、循环引用,且会丢失原型链 -
structuredClone()(现代浏览器支持):原生 API,支持 Map、Set、Date、RegExp、ArrayBuffer 等,也支持循环引用,推荐优先使用:
structuredClone(obj) - 递归实现简易深拷贝:适合学习原理或兼容老环境,需判断类型(null、基本类型、Array、Object),逐层复制;注意避免循环引用导致栈溢出,可加 WeakMap 缓存已拷贝对象
什么时候该用哪种?
选型看需求和环境:
立即学习“Java免费学习笔记(深入)”;
- 只读一层数据 → 浅拷贝足够,性能好
- 简单 JSON 数据 + 不含特殊类型 →
JSON.parse(JSON.stringify())快速可用 - 生产环境、需完整支持复杂类型 → 优先用
structuredClone;不支持时再考虑 Lodash 的cloneDeep或自研健壮版本 - 需要控制拷贝行为(如忽略某些字段、转换值)→ 自定义递归函数更灵活
容易踩的坑
实际开发中几个典型问题:
- 误把浅拷贝当深拷贝用,改嵌套属性时影响原对象
- 用
JSON方法时遇到function或Date,结果变成null或字符串 - 未处理循环引用,递归拷贝直接报错“Maximum call stack size exceeded”
- 忘记检查
null和undefined,导致类型判断出错


















