小编esp*_*spc的帖子

Spread Syntax 会创建浅拷贝还是深拷贝?

几天来我对浅拷贝和深拷贝的真正定义感到非常困惑。

\n

当我阅读浅拷贝的 mdn 文档(https://developer.mozilla.org/en-US/docs/Glossary/Shallow_copy)时,这一切都有意义。第一段清楚地解释了什么是浅拷贝。文档说

\n
\n

对象的浅拷贝是其属性与从中创建副本的源对象共享相同引用(指向相同基础值)的副本。因此,当您更改源或副本时,也可能导致其他对象也发生更改\xe2\x80\x94,因此,您最终可能会无意中导致对源或副本进行您不希望的更改\'预计。

\n
\n

我完全明白了那部分。根据我的理解,下面的代码示例是浅复制的示例,因为更改源或副本也会导致另一个对象发生更改。

\n
let 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\n
Run Code Online (Sandbox Code Playgroud)\n

所以,令人困惑的部分是当我使用扩展语法来制作副本时。这是深拷贝还是浅拷贝?因为对于我来说,对于第一级深度来说,扩展语法(运算符)正在制作深度复制。然而,MDN 文档表示扩展语法创建的是浅拷贝而不是深拷贝。

\n
\n

在 JavaScript 中,所有标准内置对象复制操作(扩展语法、Array.prototype.concat()、Array.prototype.slice()、Array.from()、Object.assign() 和 Object.create() )创建浅拷贝而不是深拷贝。

\n
\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\n
Run Code Online (Sandbox Code Playgroud)\n

javascript deep-copy shallow-copy

4
推荐指数
1
解决办法
2295
查看次数

标签 统计

deep-copy ×1

javascript ×1

shallow-copy ×1