浅拷贝只复制数组第一层,对象仍共享内存;修改新数组中对象属性会同步影响原数组,如扩展运算符、slice、concat等方法均属此类,仅对纯基本类型数组安全。

浅拷贝对数组中对象的引用关系影响很直接:它只复制数组第一层元素,如果数组里存的是对象(或嵌套数组),这些对象本身不会被复制,新旧数组仍共享同一份内存地址。
浅拷贝后,修改对象属性会同步影响原数组
比如:
const arr = [{ name: 'Alice' }, { age: 25 }];
const copied = [...arr]; // 浅拷贝
copied[0].name = 'Bob';
console.log(arr[0].name); // 输出 'Bob'
因为 copied[0] 和 arr[0] 指向同一个对象,改其中一个,另一个立刻响应。
数组方法如 slice()、concat()、扩展运算符都只做浅拷贝
它们适用于纯基本类型数组(如 [1, 2, 3]),但遇到含对象的数组时就失效了:
-
slice():复制索引值,不复制内部对象 -
concat():返回新数组,但元素仍是原引用 -
[...arr]:语法简洁,行为同slice()
嵌套结构越深,浅拷贝“漏掉”的地方越多
二维数组就是典型例子:
const matrix = [[1, 2], [3, 4]];
const copy = [...matrix];
copy[0][0] = 99;
console.log(matrix[0][0]); // 输出 99
第一层数组被复制了,但子数组 [1, 2] 仍共用引用——浅拷贝没进到第二层。
什么时候能放心用浅拷贝?
仅当数组所有元素都是基本类型(number/string/boolean/null/undefined)时,浅拷贝才真正“安全”:
-
[1, 'a', true]→ 浅拷贝后完全独立 -
[{}, [], new Date()]→ 必须深拷贝
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











