实现深克隆
使用递归思想,整体思路和浅克隆类似,但稍微进行一些改动:如果遍历到项是基本类型值,则直接推入结果数组;如果遍历到的是项是又是数组,则重复执行浅克隆的操作.
复习应用类型值得相关知识
- javaScript中得数据类型有两类:基本类型和引用类型值
复习浅克隆
- 使用var arr2 =arr1这样的语句不能实现数组的克隆
- 浅克隆:准备一个空的结果数组,然后使用for循环遍历原数组,将遍历到的项都推入结果数组
- 浅克隆只克隆数组的一层,如果数组是多维数组,则克隆的项会"藕断丝连"
浅克隆案例
//准备原数组
var arr1 = [33,44,22,11]
//准备一个结果数组
var result = []
//遍历原数组,将遍历到的项都推入到结果数组中
for(var i=0;i<arr1.length;i++){
result.push(arr1[i])
}
console.log(result) //33 44 22 11
console.log(arr1==reesult); //flase
深克隆案例
// 准备原数组
var arr1 = [33, 66, 11, 555, 44, [22, 33, 11, 65, 74, [32, 41, 42]]]
// 函数,这个函数会被递归
function deepClone(arr) {
// 结果数组,"每一层"都有一个结果数组
var result = []
// 遍历数组的每一项
for (var i = 0; i < arr.length; i++) {
// 类型判断,如果遍历到的是数组
if (Array.isArray(arr[i])) {
// 递归
result.push(deepClone(arr[i]))
}
else {
// 如果遍历到的项不是数组,是基本类型值,就直接推入到结果数组中
// 相当于是递归的出口
result.push(arr[i])
}
}
// 返回结果数组
return result;
}
var arr2 = deepClone(arr1)
console.log(arr2)