对于浅拷贝和深拷贝的真正定义,我已经困惑了好几天了.
当我在浅拷贝上阅读mdn文档(https://developer.mozilla.org/en-US/docs/Glossary/Shallow_copy)时,这一切都是有道理的.第一段清楚地解释了什么是肤浅的复制品.doctor 说
对象的浅层副本是一个副本,其属性与从中创建副本的源对象的属性共享相同的引用(指向相同的基础值).因此,当您更改源或副本时,也可能会导致其他对象也发生更改——因此,您可能会无意中导致对源或副本的更改超出预期.
我完全明白了.据我所知,下面的代码示例是浅拷贝的示例.因为更改源或副本都会导致另一个对象也发生更改.
let a = {
food: "pasta",
restaurantName: "myPastPlace"
}
let b = a
b.food = "Hamburger"
console.log(b.food) //hamburger
console.log(a.food) //hamburger
所以,令人困惑的是,当我使用spread语法制作副本时.这是深拷贝还是浅拷贝?因为对于第一级deep,对我来说,扩展语法(操作符)是一个深度复制.然而,Mdn文档表示,spread语法创建的是浅拷贝,而不是深拷贝.
在JavaScript中,所有标准的内置对象复制操作(扩展语法、Array.prototype.concat()、数组).原型slice(),array.from(),对象.assign()和对象.create())创建浅拷贝而不是深拷贝.
let a = {
food: "pasta",
restaurantName: "myPastPlace"
}
let b = {...a}
console.log(b)
b.food = "hamburger"
console.log(b.food) //hamburger
console.log(a.food) //pasta