关于浅克隆

关于浅克隆

相关代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var arr1=[1,[2,3]];
        var arr2=[arr1[0],arr1[1]];
        arr1[1].push(4);
        arr1.pop();
        console.log(arr2);
    </script>
</body>
</html>

问题描述:

请问老师上述输出arr2的值为什么不是[1],而是[1,[2,3]]?




正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,可以参考如下来理解:

首先,这段代码中arr1[1]的结果是一个数组,数组是引用类型数据,此时引用类型数据不会被克隆,内存中也不会产生新的副本,而是让新变量指向该引用类型数据。其次,arr1.pop()只是删除了arr1对该数组的指向,因为该数组一直还在被arr2中的元素指向,所以该数组还在内存中,并未消失,也因此arr2输出的结果是[1,[2,3]]。

祝学习愉快!

  • 一坨羊毛 提问者 #1

    arr1[1]的指向删除了,那arr2=[arr[0],arr[1]]这条语句中的arr[1]不会被删除吗?

    2021-12-06 10:26:20
  • 好帮手慕然然 回复 提问者 一坨羊毛 #2

    同学你好,不会删除的,arr1.pop()后由[1,[2,3]]变为了[1],此时arr1中删除了数组[2,3],但是arr2=[arr1[0],arr1[1]]中的arr1[1]还在指向[2,3]这个数组,所以这个数组不会在内存中消失。

    祝学习愉快!

    2021-12-06 10:51:40
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师