几天来我对浅拷贝和深拷贝的真正定义感到非常困惑。
\n当我阅读浅拷贝的 mdn 文档(https://developer.mozilla.org/en-US/docs/Glossary/Shallow_copy)时,这一切都有意义。第一段清楚地解释了什么是浅拷贝。文档说
\n\n\n对象的浅拷贝是其属性与从中创建副本的源对象共享相同引用(指向相同基础值)的副本。因此,当您更改源或副本时,也可能导致其他对象也发生更改\xe2\x80\x94,因此,您最终可能会无意中导致对源或副本进行您不希望的更改\'预计。
\n
我完全明白了那部分。根据我的理解,下面的代码示例是浅复制的示例,因为更改源或副本也会导致另一个对象发生更改。
\nlet a = {\n food: "pasta",\n restaurantName: "myPastPlace"\n}\n\nlet b = a\n\nb.food = "hamburger"\n\nconsole.log(b.food) //hamburger\nconsole.log(a.food) //hamburger\nRun Code Online (Sandbox Code Playgroud)\n所以,令人困惑的部分是当我使用扩展语法来制作副本时。这是深拷贝还是浅拷贝?因为对于我来说,对于第一级深度来说,扩展语法(运算符)正在制作深度复制。然而,MDN 文档表示扩展语法创建的是浅拷贝而不是深拷贝。
\n\n\n在 JavaScript 中,所有标准内置对象复制操作(扩展语法、Array.prototype.concat()、Array.prototype.slice()、Array.from()、Object.assign() 和 Object.create() )创建浅拷贝而不是深拷贝。
\n
let a = {\n food: "pasta",\n restaurantName: "myPastPlace"\n}\n\nlet b = {...a}\nconsole.log(b)\n\nb.food = "hamburger"\n\nconsole.log(b.food) //hamburger\nconsole.log(a.food) //pasta\n\nRun Code Online (Sandbox Code Playgroud)\n