JavaScript中Object.assign()对象拷贝与引用传递问题咨询
Object.assign() 的引用传递与浅拷贝原理
Object.assign() 本质是浅拷贝,这就是你看到两种不同表现的核心原因,具体可以拆成两种场景理解:
1. 修改顶层属性不影响原对象的情况
当你修改拷贝对象的顶层属性时,如果是给属性重新赋值(不管是原始类型还是新的对象),原对象不会受影响,因为顶层属性的拷贝规则分两种:
- 若顶层属性是原始类型(字符串、数字、布尔等),
Object.assign()直接拷贝它的具体值,拷贝对象和原对象的该属性各自独立。 - 若顶层属性是引用类型(对象/数组),
Object.assign()拷贝的是引用地址,但如果你给拷贝对象的该属性重新赋值一个新对象,相当于切断了和原对象引用的关联,原对象的属性不会变化。
示例代码:
// 原始类型顶层属性 const original1 = { name: "Alice", age: 25 }; const copy1 = Object.assign({}, original1); copy1.name = "Bob"; console.log(original1.name); // 输出 "Alice",不受影响 // 引用类型顶层属性重新赋值 const original2 = { info: { age: 25 } }; const copy2 = Object.assign({}, original2); copy2.info = { age: 30 }; // 给copy2的info赋值新对象 console.log(original2.info.age); // 输出 25,原对象不受影响
2. 修改嵌套对象属性同时影响原对象和拷贝对象的情况
当源对象的属性是嵌套对象时,Object.assign() 只会拷贝这个嵌套对象的引用地址——也就是说,拷贝对象的嵌套属性和原对象的嵌套属性指向内存中同一个对象。这时修改这个共享对象的内部属性,两个对象都会体现出变化,因为它们本质上操作的是同一个东西。
示例代码:
const original = { info: { age: 25 } }; const copy = Object.assign({}, original); copy.info.age = 30; // 修改共享嵌套对象的内部属性 console.log(original.info.age); // 输出 30,原对象被修改
核心原理总结
- 浅拷贝只拷贝对象的第一层属性:
- 第一层是原始类型:拷贝值,两者独立。
- 第一层是引用类型:拷贝引用地址,共享底层对象,修改底层对象的内部属性会同步影响原对象和拷贝对象;但给拷贝对象的第一层引用属性重新赋值新对象,则不会影响原对象。
内容的提问来源于stack exchange,提问作者Bilal Malik
相关产品推荐
相关产品推荐

