1. 浅克隆和深克隆的区别

446 阅读1分钟

 (1)、区别

浅克隆:克隆出来的数据并不能完全脱离原数据,克隆前与克隆后的变量各自的变化会相互影响。这是因为引用变量存储在栈中,而实际的对象存储在堆中。每一个引用变量都有一根指针指向其堆中的实际对象。即当一个变量值改变时,另一个变量也会跟着发生变化。
深克隆:所有元素或属性均完全复制,与原对象完全脱离,也就是说所有对于新对象的修改都不会反映到原对象中。这是因为原始变量之间的赋值操作本质上就是当一个原始变量把值赋给另一个原始变量时,只是把栈中的内容复制给另一个原始变量,在这种操作下,引用变量指向的将不再是堆中的同一块地址,因此对于新对象的修改并不会影响到原对象。

(2)深克隆代码

(3)浅克隆代码

<script>
        // 原数组
        var arr1 = [1, 2, 3, [4, 5]];
        // 结果数组用来存放克隆后的数组
        var result = [];
        //  遍历原数组,将每一个元素推入结果数组中
        for (i = 0; i < arr1.length; i++) {
            result.push(arr1[i]);
        }
        console.log(result); // [1, 2, 3, [4, 5]]
        console.log(result == arr1); //false
        arr1[3].push(6);
        console.log(arr1); // [1, 2, 3, [4, 5, 6]]
        // 浅克隆不适合克隆元素是引用类型的数组
        // 会“藕断丝连”,克隆后的数组不在独立,会随着原数组变化而变化
        console.log(result); // [1, 2, 3, [4, 5, 6]]
    </script>