浅拷贝只复制第一层,内层数组共享内存;深拷贝递归复制所有层级,新旧数组完全独立。如arr = [[1,2],[3,4]],浅拷贝后shallow[0].push(5)会改变原数组,深拷贝则不会。

浅拷贝只复制多维数组的第一层,内层数组仍共享同一内存地址;深拷贝则递归复制每一层,新旧数组完全独立,互不影响。
浅拷贝:外层新、内层共用
对多维数组使用 slice()、concat() 或 [...arr] 等方式,仅创建外层数组的副本,但每个子数组仍是原引用。
- 修改外层数组元素(如替换整个子数组)不会影响原数组
- 修改子数组内部元素(如
newArr[0][1] = 99)会同步反映到原数组 - 常见写法:
const shallow = arr.slice();、const shallow = [...arr];
深拷贝:逐层新建,彻底隔离
深拷贝确保每一级嵌套结构都生成全新内存空间,修改任意层级都不会波及原数组。
-
JSON.parse(JSON.stringify(arr))最简捷,但不支持函数、undefined、Date、RegExp 等类型 - 递归实现可处理任意嵌套结构,也能兼容特殊对象(需手动判断类型并处理)
- 第三方库如 Lodash 的
_.cloneDeep()更健壮,能应对循环引用等边界情况
实际差异一眼看穿
以 const arr = [[1, 2], [3, 4]]; 为例:
- 浅拷贝后执行
shallow[0].push(5)→arr变成[[1, 2, 5], [3, 4]] - 深拷贝后执行同样操作 →
arr保持不变,仍是[[1, 2], [3, 4]]
选哪种?看需求和数据结构
若多维数组只含简单值(数字、字符串、布尔),且无特殊对象,JSON 方式够用;若含函数、日期或需高可靠性,优先用递归或成熟库;若确定只改外层、不碰子项,浅拷贝更轻量高效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











