问一道js的基础题

function setName(obj){
    obj.name = "obama";
    obj = {name:"clinton"};
}
var president = {name:"bush"};
setName(president);

执行完只段代码以后president.name的值为什么是"obama"
记得javascript高级程序设计中讲过,就是忘记在哪页了

阅读 3k
5 个回答

一句一句的分析代码:

var president = {name:"bush"};

president指向{name:"bush"}对象

setName(president);

obj指向president指向的对象, 也就是{name:"bush"}

obj.name = "obama";

obj指向的对象(也就是president指向的对象)的name属性值改为"obama"

obj = {name:"clinton"};

obj的指向从{name:"obama"}对象改为了{name:"clinton"}对象
president仍然指向{name:"obama"}对象

说下我的理解:president被以引用传递的方式传了过去,所以obj.name更改的是原来的object,后边一句仅仅是将这个引用覆盖为新的对象,并未影响到外层的president!

未实测,供参考!

只说关键的:

function setName(obj){
    obj.name = "obama";
    obj = {name:"clinton"};
}

最后一行赋值语句做的事情是将obj指向了一个新的对象{name:"clinton"},而obj原先指向的对象并没有受影响,还在原来的内存里保存着。

新手上路,请多包涵

因为你是整个对象传递进去,不属于基本的数据类型,在内存占有固定的位置。所以obj.name="Obama“

其实很简单,你这个相当于把对象作为参数传进去,无非是实参和形参的问题,你那个对象相当于obj,那么你说obj.name是啥?自然不就出来了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题