老师 关于克隆的问题

来源:5-6 深克隆和浅克隆

lcy_18

2021-03-20 23:00:21

console.log(result == arr1);    // 期望false,因为引用类型值进行比较的时候,等等比较的是内存地址(这个不是说明result和arr1不是同一个内存地址吗

        console.log(result[4] == arr1[4]);  // 藕断丝连(不是一个内存地址,为什么值会相等???

<!DOCTYPE html>

<html>


<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>


<body>

    <script>

        var arr1 = [1, 2, 3, 4, [6, 9, 4]];


        // 结果数组

        var result = [];


        // 遍历原数组中的每一项,把遍历到的项推入到结果数组中

        for (var i = 0; i < arr1.length; i++) {

            result.push(arr1[i]);

        }


        console.log(result);

        console.log(result == arr1);    // 期望false,因为引用类型值进行比较的时候,等等比较的是内存地址

        console.log(result[4] == arr1[4]);  // 藕断丝连

    </script>

</body>


</html>


写回答

2回答

好帮手慕久久

2021-03-21

同学你好,解答如下:

同学提供的代码中,result[1]的结果是数字2,arr1[1]的结果也是数字2,2和2相等,所以console.log(result[1] == arr1[1]); 是true。等号“=”比较基本类型的值(比如数字),是否相等时,比较的是是否相等,而不是地址;只有比较引用类型时,才会比较地址。所以这里要比较result[4] 与arr1[4],才能看出result与arr1是否还有关联。

祝学习愉快!


0

好帮手慕久久

2021-03-21

同学你好,解答如下:

result == arr1是false,说明二者的内存地址不一样。但是如果arr1中有引用类型的数据,比如数组:

http://img.mukewang.com/climg/6056ab2d0916d53205850112.jpg

那么复制得到的result中的该元素,会与arr1中的该元素,指向相同(内存地址相同):

http://img.mukewang.com/climg/6056abfd0900d60f05450283.jpg

所以即使arr1与result的内存地址不存,但是二者中的元素[6,9,4]是同一个内存地址,因此

  console.log(result[4] == arr1[4]);的结果为true。

祝学习愉快!


0
hasyschen
回复
hcy_18
hp>因为:

result[1] = 1 是数值

arr1[1] = 1 也是数值   

两个都是基本数据类型值。 1=1     


result[4]=[6,9,4] 和 arr1[4] = [6,9,4] 都是地址,所以也是true;


result是arr1克隆来的。 整个的地址不同。

h021-12-01
共2条回复

0 学习 · 15276 问题

查看课程

相似问题

浅克隆

回答 1

关于浅克隆

回答 1

浅克隆

回答 1