首页 > 问一道js的基础题

问一道js的基础题

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

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


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


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


只说关键的:

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

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


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

未实测,供参考!


一句一句的分析代码:

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"}对象

【热门文章】
【热门文章】