两个地方不懂,如下

两个地方不懂,如下

<script type="text/javascript">
        function setName(obj){
            obj.name="xm";
            obj={};
            obj.name="xh";
        };
        var person={};
        setName(person);
        document.write(person.name);
    </script>
如上代码执行到setName(person)时,可以解析为如下:
function setName(person){
            person.name="xm";
            person={}; //这里又用person去开辟了新空间,也就相当于person在堆内存中开辟了两个内存空间???
            person.name="xh";
};
即:document.write(person.xh);
为什么结果输出是xm呢!

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

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

2回答
纵有疾风起呵 2019-06-07 19:49:38

引用类型保存的是内存地址,例如这个代码中,实参person和形参obj 实则是两个变量,但是都指向了原来person指向的堆内存,操作起来就像一个变量一样,所以让你有这种误会。函数中obj={} 则是将obj保存的内存地址改变为了这个{}的空对象。  题主明白没

好帮手慕星星 2019-03-27 12:00:37

你好,给obj赋值的时候理解的有些问题,执行到obj.name="xm";的时候,可以理解为person.name='xm'。下面obj={},是给obj参数重新赋值了一个空间,就不能理解是给person赋值了。所以重新赋值之后的一系列操作和person就没有关系了,最后输出的name属性也就是改变之前赋的值。

可以在改变前面输出下obj和person是否相等:

http://img1.sycdn.imooc.com//climg/5c9af54f00012d6004960282.jpg

http://img1.sycdn.imooc.com//climg/5c9af5550001745401580061.jpg

自己可以测试理解下,祝学习愉快!

  • obj不是形参吗?传递实参进来后obj就被person代替了啊,为什么obj.name = "xm"时可以传递实参,obj.name = "xh"就不是person传进来了?
    2019-05-22 22:22:44
  • 你好,obj是形参,开始obj指向的是person的地址,所以可以改变person中的内容,后来obj指向的是另一个空对象地址,和person对象指向的不是同一个地址,所以obj属性改变的时候,person对象中的内容不会改变。
    2019-05-23 10:01:12
  • 不是替代,只是相当于obj=person,两个指向同一个空间,修改obj就相当于修改person。后来把obj={},指向新的,就与person毫无关系了。
    2019-07-03 17:24:41
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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