3 回答
TA贡献1784条经验 获得超9个赞
不同之处在于,在第一个代码段中,您修改了属性中的嵌套对象info
,而在第二个代码段中,您修改了包含对象。
当您进行浅拷贝时,girl
和newGirl
是不同的对象,但它们都包含对同一info
对象的引用。Sogirl.info
和newGirl.info
是同一个对象,修改其中一个的属性会通过访问另一个反映出来。
但是,如果您分配给girl.name
或newGirl.name
正在修改不同对象的属性。您不会看到其他对象的变化。这就是您在第二个代码段中通过分配给所做的事情output.age
。
深拷贝会复制递归引用的所有对象,而不仅仅是顶级对象。如果您进行深拷贝,则在访问其他对象时不会看到任何级别的修改。
TA贡献1798条经验 获得超3个赞
您在第二个示例中更改了两件事:
将对象传入和传出函数
改变了对象的结构
您看到的差异与通过函数的额外间接无关,仅与对象的结构有关。
让我们一次改变一件事,看看会发生什么:
const girl = { age: 20, number: 123 };
const newGirl = { ...girl };
newGirl.age = 30;
console.log(girl.age, newGirl.age);
输出:20 30- 原始对象没有被修改,因为我们直接复制了标量值age,所以这两个属性是完全分开的。
function test(obj) {
const output = { ...obj };
output.info.age = 30;
return output;
}
let person = { info: { age: 10 } }
let newPerson = test(person);
console.log(newPerson.info.age, person.info.age);
输出是30 30- 原始对象已被修改,因为我们只复制了属性的对象引用info,所以两个属性都持有指向同一个对象的引用。
添加回答
举报