JavaScript数组遍历本身不实现深拷贝,需结合JSON序列化、structuredClone()或递归等策略;JSON方法简洁但有类型限制,structuredClone()是现代推荐方案,递归则兼容性强且可控。

JavaScript 数组遍历本身不直接实现深拷贝,它只是访问元素的手段;真正完成深拷贝需要结合序列化/反序列化、递归或结构化克隆等策略。关键在于:**遍历是过程,深拷贝是目标,二者需配合使用**。
用 JSON.parse(JSON.stringify()) 快速浅层深拷贝(适合纯数据)
这是最常用、最简洁的方式,适用于只含基本类型、普通对象、数组的“纯数据结构”,不支持函数、undefined、Date、RegExp、Map、Set、循环引用等。
- 先遍历原数组(可选,比如做预处理),再对整个数组执行 JSON 操作
- 代码示例:const deepCopy = JSON.parse(JSON.stringify(originalArray));
- 注意:若数组里有
Date对象,会变成字符串;undefined和函数会被丢弃
用 structuredClone() 直接深拷贝(现代浏览器推荐)
这是目前标准、安全、支持大多数内置类型的深拷贝方法,无需手动遍历,内部已处理嵌套逻辑。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 支持 Map、Set、Date、RegExp、ArrayBuffer、TypedArray、Error 等,也支持循环引用(部分环境)
- 代码示例:const deepCopy = structuredClone(originalArray);
- 兼容性注意:Chrome 98+、Firefox 94+、Edge 98+,Safari 15.4+;Node.js 17.0+(需启用 --harmony-structured-clone)
手动递归实现(完全可控,兼容老环境)
当需要兼容旧浏览器,或要自定义拷贝逻辑(如过滤某些字段、转换日期格式)时,可写递归函数,遍历时判断类型并分别处理。
立即学习“Java免费学习笔记(深入)”;
- 核心思路:对每个元素,如果是数组或对象就递归拷贝,否则直接返回值
- 示例片段:
function deepClone(obj) { if (obj === null || typeof obj !== 'object') return obj; if (obj instanceof Date) return new Date(obj); if (obj instanceof Array) return obj.map(item => deepClone(item)); if (obj instanceof Object) { const cloned = {}; for (let key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { cloned[key] = deepClone(obj[key]); } } return cloned; } return obj; } - 此方式可扩展性强,但需自行处理特殊类型(如 RegExp、Map、Set)
避免常见误区
-
for...of / forEach / map 等遍历方法本身不会深拷贝——它们只是读取或映射值,若直接赋值(如
newArr.push(item)),仍是浅拷贝 - 扩展运算符 ... 和 Array.from() 仅深拷贝第一层——对嵌套数组/对象内的引用无影响
- 不要用 Object.assign([], arr) 或 arr.slice() 做深拷贝——它们都只复制引用

















