1.浅拷贝:浅拷贝是基于原对象实时映射的,新对象与原对象在堆中的同一个对象拿出来的,如果拷贝后的新对象或原对象发生改变,会把改变的内容传回堆中,进而影响到另一个对象
let obj1 = {
uname: 'a',
age: 34,
cars: ['五菱宏光', '金杯'],
parent: {
fa: 'b',
mo: 'c'
}
}
let obj2 = {}
for (let k in obj1) {
obj2[k] = obj1[k]
}
console.log(obj1)
console.log(obj2)
for (let k in obj1) 中的k,便是循环出来的key值,所以obj1[k]就是obj1的每一个value
数组的浅拷贝,从改变原数组影响到新数组
let arr1 = ['孙悟空', 18]
let arr2 = arr1
console.log(arr1)
console.log(arr2)
arr1[0] = '齐天大圣'
console.log(arr2)
2.深拷贝: 深拷贝是将原对象在堆中对应的对象复制另一份到堆中,新对象与原对象是不会发生牵扯的,不会相互影响相互改变
let obj1 = {
uname: 'a',
age: 34,
cars: ['五菱宏光', '金杯'],
parent: {
fa: 'b',
mo: 'c'
}
}
function deepCopy(newObj, oldObj) {
// 遍历对象
for (var k in oldObj) {
let item = oldObj[k]
// 判断item的类型 如果是数组的话 先创建一个空数组
if (Array.isArray(item)) {
// 创建空数组
newObj[k] = []
deepCopy(newObj[k], item) // 这里使用了递归结构,为防止子项里面还有数组
} else if (item instanceof Object) {
// 创建 空对象
newObj[k] = {}
deepCopy(newObj[k], item) // 这里使用了递归,防止子项里面有对象
} else {
// 复制拷贝
newObj[k] = item
}
}
}
deepCopy(obj2, obj1)
// console.log(obj2)
obj2.fa[0] = 'bb'
console.log(obj2)
console.log(obj1)
深拷贝是在递归结构中先创建一个空对象或空数组,将原对象的每一个key所对应的value逐个放入,在原对象的子项中发现还有对象或数组就会继续在新对象中的子项创建空对象或数组,然后再将内容逐一传入.这样一来便在堆中克隆出来了一个与原对象当前状态一模一样的新对象,此时对原对象或新对象的任何改动都不会改变对方的内容