递归与循环的区别就是递归有尽头(终止条件),而循环无尽头。
调用自身是递归算法中最难理解的部分,实际上可以理解为:问题分解为了规模更小的相同问题。
下面是使用递归实现深拷贝的代码:
function deepClone(obj) {
let objClone = Array.isArray(obj) ? [] : {};
if(obj && typeof obj === "object") {
for(key in obj) {
if(obj.hasOwnProperty(key)) {
// 判断 obj 是否是对象,如果是,递归复制
if(obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
}else{
// 如果不是
objClone[key] = obj[key];
}
}
}
}
return objClone
}
let a = [1,2,3,4],
b = deepClone(a);
a[0] = 5;
console.log(a,b) // a:[5,2,3,4] b:[1,2,3,4]