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