淺拷貝和深拷貝都是發(fā)生在應(yīng)用類型上的,引用類型有 對(duì)象 寓搬,數(shù)組林艘,null伪窖,函數(shù)
這里一般考慮的是對(duì)象氧敢,數(shù)組啰脚,null
1.淺拷貝
const obj1 = {
age: 20,
name: 'xxx',
address: {
city: 'beijing'
},
arr: ['a', 'b', 'c']
}
const obj2 =obj1//這里就是淺拷貝,obj2里的屬性值改變那么obj1里面的值也會(huì)隨之改變
obj2.address.city = 'shanghai'
obj2.arr[0] = 'a1'
console.log(obj1.address.city)// 'shanghai'
console.log(obj1.arr[0])//a1
2.深拷貝
/**
* 深拷貝
*/
const obj1 = {
age: 20,
name: 'xxx',
address: {
city: 'beijing'
},
arr: ['a', 'b', 'c']
}
const obj2 = deepClone(obj1)
obj2.address.city = 'shanghai'
obj2.arr[0] = 'a1'
console.log(obj1.address.city)//beijing
console.log(obj1.arr[0])//'a'
/**
* 深拷貝
* @param {Object} obj 要拷貝的對(duì)象
*/
function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
// obj 是 null 康吵,或者不是對(duì)象和數(shù)組,直接返回
return obj
}
// 初始化返回結(jié)果
let result
if (obj instanceof Array) {
result = []
} else {
result = {}
}
for (let key in obj) {
// 保證 key 不是原型的屬性
if (obj.hasOwnProperty(key)) {
// 遞歸調(diào)用7玫荨;耷丁!
result[key] = deepClone(obj[key])
}
}
// 返回結(jié)果
return result
}
淺拷貝是無(wú)法改變引用類型的在堆棧里面的引用地址拷姿,兩個(gè)變量共用的是同一個(gè)引用地址惭载,改變的是同一個(gè)地方的東西,所以淺拷貝導(dǎo)致响巢,一個(gè)變量改變會(huì)引起另一個(gè)變量同樣改變
深拷貝是重新給變量開了一個(gè)新的引用地址描滔,這樣與原來(lái)的徹底分開,相當(dāng)于給自己分了一個(gè)新的空間踪古,里面的內(nèi)容雖然一樣了含长,但是其中一個(gè)即使改變了,另一個(gè)是不會(huì)受到影響的