js中简单和复杂数据类型存储和传递问题

简单和复杂数据类型存储和传递:

<script type="text/javascript">
        var num1 = 0;
        var num2 = num1;
        num1 = 1;
        //请问num2的值会改变吗?
        console.log(num2);

        var stu1 = new Object();
        stu1.name = "张三";
        var stu2 = stu1;
        //改变stu1的name值
        stu1.name = "李四";
        //请问stu2的值会改变吗?
        console.log(stu2.name);
    </script>

结果如下:


又如:

            //简单数据类型
            var num = 1;
            fn1(num);
            console.log(num);

            function fn1(aaa){
                aaa = aaa*10;
            }


            //复杂数据类型
            var obj = new Object();
            obj.name = "张三";
            fn2(obj);
            console.log(obj);

            function fn2(object){
                object.name = "李四";
            }


结果也会一样




为什么会出现这种情况呢?

简单数据类型赋值时,传的是数值。(即开辟新的空间)

而复杂数据类型赋值时,传的时地址(即修改同一片内存空间)

如下图所示:

简单数据类型赋值:


因为是在栈里面另外开辟一个空间,所以num2的值不会改变,改变的是另一个空间的值


复杂数据类型:

而复杂的数据类型时在堆中复用一个内存空间

所以才会出现以上的情况


那么要如何避免呢?

当你向修改成员变量中的简单数据类型时,不要通过参数传递,只要在函数中直接修改就行了。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值