深克隆

69 阅读1分钟

实现深克隆

使用递归思想,整体思路和浅克隆类似,但稍微进行一些改动:如果遍历到项是基本类型值,则直接推入结果数组;如果遍历到的是项是又是数组,则重复执行浅克隆的操作.

复习应用类型值得相关知识

  • javaScript中得数据类型有两类:基本类型和引用类型值

Snipaste_2023-02-27_19-53-09.png

复习浅克隆

  • 使用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)