对象数组深拷贝需确保每个对象独立,常用方法有三:JSON序列化/反序列化(简洁但丢函数、undefined,不支持特殊类型和循环引用)、structuredClone(现代标准,支持Date/Map/Set等及循环引用,但不支持function/undefined/Symbol)、手动遍历+元素克隆(可控性强,依赖类实现clone方法)。

对象数组的深拷贝,核心是让新数组里的每个对象都成为原对象的独立副本,而不是共享引用。改副本不会影响原数组,改原数组也不会波及副本。
用 JSON 序列化/反序列化(简单场景首选)
适合只含基本类型、普通对象、数组、null 的对象数组,不含函数、undefined、Symbol、Date、RegExp、Map、Set 等特殊值,也无循环引用:
-
写法简洁:
const copy = JSON.parse(JSON.stringify(originalArray)); - 原理清晰:先转成字符串切断所有引用,再解析成新对象树
- 注意限制:会丢掉函数、undefined;Date 变成字符串;循环引用直接报错
用 structuredClone(现代浏览器推荐)
Chrome 98+、Firefox 94+、Safari 15.4+ 和 Node.js 17+(启用实验特性)已支持,是目前最接近“开箱即用”的标准方案:
- 天然支持:Date、RegExp、Map、Set、ArrayBuffer、TypedArray,还能正确处理循环引用
-
使用直接:
const copy = structuredClone(originalArray); -
不支持项:function、undefined、Symbol —— 这些本就不属于可结构化克隆的数据类型,会抛出
DataCloneError
手动遍历 + 元素克隆(可控性强,需配合类设计)
当对象类已实现 Cloneable 并重写了 clone()(且内部字段也完成深拷贝),可用此方式:
-
Java 示例:
Person[] copy = new Person[src.length]; for (int i = 0; i -
关键前提:每个元素的
clone()方法必须递归处理其可变字段(如 List、嵌套对象等) - 优点:不依赖序列化,性能较好,逻辑透明
序列化反序列化(Java 通用解法)
适用于任意嵌套结构、含集合或自定义对象的对象数组,前提是所有类都实现 Serializable:
- 无需修改业务逻辑:只要类可序列化,就能一键深拷贝
-
缺点明显:性能低;无法复制
transient字段;有安全限制(如反序列化漏洞风险) -
典型用法:封装为泛型工具方法,调用时捕获
IOException和ClassNotFoundException

















