javascript 中对象属性的修改是浅拷贝。直接赋值或简单的展开运算符只会复制对象的引用,导致修改嵌套属性时影响原对象。

直接赋值与展开运算符的引用行为
使用 `=` 赋值或 `{...obj}` 展开运算符创建的对象,其内部嵌套对象依然指向同一内存地址。修改新对象中的深层属性会同步改变原对象。

const original = { a: 1, nested: { b: 2 } };
const shallowCopy = { ...original };
shallowCopy.nested.b = 999;
console.log(original.nested.b); // 输出 999
上述代码展示了展开运算符的行为。`shallowCopy` 拥有 `a` 和 `nested` 的引用,而非副本。当 `shallowCopy.nested.b` 被修改时,由于 `original.nested` 指向同一个对象,`original` 也随之改变。
JSON 序列化与结构化克隆的差异
`JSON.parse(JSON.stringify())` 和 `structuredClone()` 可以实现深拷贝。前者会丢失函数、`undefined` 和循环引用;后者支持更复杂的数据结构但受限于特定类型。

const original = { a: 1, nested: { b: 2 }, fn: () => {} };
const deepJson = JSON.parse(JSON.stringify(original));
const deepClone = structuredClone(original);
console.log(deepJson.fn); // undefined
console.log(deepClone.fn); // [Function: fn]
对比两种深拷贝方式。`JSON` 方法将函数转换为 `undefined`,因为它只处理数据部分。`structuredClone` 保留了函数引用(在支持的环境中),并正确处理了嵌套对象,使其与原对象完全独立。
基于嵌套对象修改的具体验证
在之前的示例中,修改 `nested` 属性证实了浅拷贝的特性。若需避免此问题,必须使用深拷贝方法或手动递归合并属性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











