什么是深拷貝、淺拷貝
深拷貝:修改新變量的值不會影響原有變量的值。默認情況下基本數(shù)據(jù)類型都是深拷貝。
淺拷貝:修改新變量的值會影響原有的變量的值。默認情況下引用類型都是淺拷貝。
解構賦值
ES6的新特性,按照一定模式,從數(shù)組和對象中提取值,對變量進行賦值,這被稱為解構。具體操作本文章不做描述。
那么我們在使用解構賦值的時候,到底是深拷貝還是淺拷貝呢?我們可以通過以下的例子得出結論:
const a = {
name: 'name',
age: 18,
marriage: false,
addr: { province: 'sichuan', city: 'chengdu' }
}
let { name, age, marriage, addr } = a
name = 'myname'
age = 26
marriage = true
addr.province = 'shanghai'
addr.city = 'shanghai'
console.log(name, age, marriage, addr)
console.log(a)
輸出
// myname 26 true {province: "shanghai", city: "shanghai"}
// { name: "name", age: 18, marriage: false, addr: {province: "shanghai", city: "shanghai"} }
以上例子中,我們從對象a中解構賦值了name、age、marriage、addr四個變量,分別是string、number、boolean 、object類型。改變這四個變量的值后,再與a原來的值作對比,我們發(fā)現(xiàn)a的name,age,marriage屬性沒有改變,而addr屬性發(fā)生了改變。由此可以得出結論,解構賦值對object類型只是淺拷貝。
實際上,無論是使用擴展運算符(...)還是解構賦值,對于引用類型都是淺拷貝。所以在使用splice()、concat()、...對數(shù)組拷貝時,只有當數(shù)組內部屬性值不是引用類型是,才能實現(xiàn)深拷貝。