递归
递归的定义
递归是函数自己调用自己的过程
递归的特点
类似于循环且必须有结束语句
递归深拷贝
因为对象和数组这种引用数据类型它们赋值赋的是地址而不是数值,所以在修改内容时会改变原属性的值
var oldObj = {
name: '小明',
age: 18,
obj: {
age: 20
}
}
var newObj = oldObj
newObj.age = 30
console.log(newObj);
console.log(oldObj);
我们在newObject中修改age的值但是oldObject里的age也改变了,这不是我们想要的结果,这种我们称之为浅拷贝。并且一般的深拷贝方法只能遍历一层,当对象里面嵌套对象时就无法实现第二层的深拷贝
而递归的深拷贝则是为了解决这样的问题
var oldObj = {
name: '小明',
age: 18,
obj: {
age: 20
}
}
var newObj = {}
function deepCopy(oldObj, newObj) {
for (var key in oldObj) {
if (oldObj[key].constructor == Array) {
newObj[key] = []
deepCopy(oldObj[key], newObj[key])
} else if (oldObj[key].constructor == Object) {
newObj[key] = {}
deepCopy(oldObj[key], newObj[key])
} else {
newObj[key] = oldObj[key]
}
}
}
deepCopy(oldObj, newObj)
newObj.age = 30
newObj.obj.age = 40
console.log(oldObj);
console.log(newObj);
由输出结果我们可以看到,不仅深拷贝实现了并且第二层的age也实现了深拷贝,即newObject的age被修改为了40,而oldObject中的第二层的age依然是20
因为递归的定义便是函数自己调用自己,所以我们创建了一个deepCopy函数,将newObject和oldObject以参数的形式传递进去,通过for... in循环遍历并赋值即可完成深拷贝,重点在于对象里可能嵌套第二层对象甚至更多,所以我们可以使用if判断对象属性的类型,若嵌套的属性依然是引用类型我们只需再次调用deepCopy方法即可,因为deepCopy不就是用来完成深拷贝定义的方法嘛,这样既可完成递归深拷贝。