浅克隆:obj1属性c变化在后,为什么先在控制台打印出的obj2也变了???????

浅克隆:obj1属性c变化在后,为什么先在控制台打印出的obj2也变了???????

<!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 obj1 = {

            a:1,

            b:2,

            c:[33,44]

        };


        var obj2 ={};

        for(var k in obj1){

            //当对象里的属性,给一个变量赋值后,获得该对象属性值就使用中括号,而不是点语法

            //k变量,遍历对象的每一个属性

            //下面语句的含义的,将obj1里的每个属性通过k克隆到obj2对象,并把该属性的值也传给obj2

            obj2[k] = obj1[k];

        }

        console.log(obj2);  //{a:1,b:2,c:[33,44,55]}这里是obj1属性c变化在后,为什么这里也变了???????

        obj1.c.push(55);    //给obj1里的c属性---它是数组(引用类型),做一个改变,看看是否有变化

        console.log(obj1);  //{a:1,b:2,c:[33,44,55]}

        console.log(obj2);  //{a:1,b:2,c:[33,44,55]}也发生了变化,说明c属性是相同一个(引用地址相同),“藕断丝连”,并没有全部分开

    </script>

</body>

</html>


正在回答 回答被采纳积分+1

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

1回答
好帮手慕久久 2022-03-08 10:43:09

同学你好,解答如下:

如果变量的值是数组或对象,那么var a=b这样的操作,a和b会指向同一个对象。比如下面这个例子:

https://img1.sycdn.imooc.com//climg/6226c07609db484303030062.jpg

由于arr1是数组,将arr1复制给arr2后,变量arr1和arr2实际上指向的是内存中的同一个数据:

https://img1.sycdn.imooc.com//climg/6226c23409dde0c005740211.jpg

此时修改[1,2]这个数组,那么arr1和arr2都会跟着变化。

由于obj1的c属性是数组,所以 obj1.c和obj2.c是指向同一个[33, 44]的,obj1改变[33, 44],那么obj2的c就跟着变了。

祝学习愉快!

  • 提问者 宝慕林6548283 #1

    谢谢老师,回答这么快,这个我理解,变化后面打印obj2变化了,我能理解,我就是不懂为什么变化前打印的obj2的结果也变了。

    2022-03-08 10:46:47
  • 好帮手慕久久 回复 提问者 宝慕林6548283 #2

     这是控制台的问题,虽然是先打印的,但是也会受后面代码运行的影响。可以刷新一下,能看到区别:

    https://img1.sycdn.imooc.com//climg/6226c46009ba796807090228.jpg

    https://img1.sycdn.imooc.com//climg/6226c46c09e95ef805810161.jpg

    这里同学注意一下。

    如果想看之前的obj2,建议把后面的代码注释掉,防止后面的代码干扰。

    2022-03-08 10:51:42
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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