浅拷贝会共享嵌套对象引用,深拷贝则完全独立;判断方法是修改拷贝后数组的嵌套对象属性,观察原数组是否变化,并用===比较引用是否相同。

直接看修改后原数组是否受影响:如果改拷贝后的数组,原数组里嵌套的对象或数组也跟着变,那就是浅拷贝;如果原数组完全不受影响,就是深拷贝。
改一个嵌套元素,观察原数组变化
这是最直观、最可靠的判断方式。关键不是改第一层数字或字符串,而是改数组里包含的引用类型——比如对象、另一个数组。
- 准备一个含嵌套结构的数组:const original = [1, 2, { name: 'Alice' }];
- 做一次拷贝(例如用 [...original] 或 original.slice())
- 修改拷贝数组中那个对象的属性:copied[2].name = 'Bob';
- 检查 original[2].name —— 如果也变成 'Bob',说明是浅拷贝;仍是 'Alice',大概率是深拷贝
比较嵌套项的内存引用是否相同
JavaScript 中两个对象或数组是否为同一份数据,可以用 === 判断引用是否相等。
- 对拷贝前后数组的某个嵌套项做引用对比:copied[2] === original[2]
- 结果为 true → 共享同一对象 → 浅拷贝
- 结果为 false → 独立对象 → 满足深拷贝的一个必要条件(注意:仅说明这一层独立,不能保证深层全独立)
注意常见“伪深拷贝”陷阱
有些方法看起来像深拷贝,其实只处理了部分情况:
- JSON.parse(JSON.stringify(arr)):能处理纯数据对象和数组,但会丢掉函数、undefined、Date、RegExp、Symbol、循环引用等
- 结构赋值 [...arr]、arr.slice()、arr.concat():全是浅拷贝,对嵌套数组/对象无效
- 第三方库如 Lodash 的 _.cloneDeep():真正递归深拷贝,较可靠
简单验证代码模板
可直接运行测试:
const original = [1, 2, { x: 0 }];
const copied = JSON.parse(JSON.stringify(original)); // 或换成你的拷贝方式
copied[2].x = 99;
console.log('original[2].x:', original[2].x); // 深拷贝应输出 0,浅拷贝输出 99
console.log('引用是否相同:', copied[2] === original[2]); // 深拷贝应为 false











