<script type="text/javascript">
function setName(obj) {
obj.name = "xiaobai";
obj = new Object();
obj.name = "xiaohei";
}
var dog = new Object();
setName(dog);
alert(dog.name);
/*输出
*xiaobai
*/
</script>
我想不通为什么输出的是“xiaobai”,应该是“xiaohei”吧。javascript
function setName(obj) {
obj.name = "xiaobai";
obj = new Object();
obj.name = "xiaohei";
}
var dog = new Object();
setName(dog);
alert(dog.name);
/*输出
*xiaobai
*/
</script>
我想不通为什么输出的是“xiaobai”,应该是“xiaohei”吧。javascript
obj.name = "xiaobai";
var x=obj;
obj = new Object();
obj.name = "xiaohei";
alert(x===obj);
}
var dog = new Object();
setName(dog);
alert(dog.name);
可能是因为第一次的时候obj是指向dog的对象
而重新new Object后obj不再指向dog 所以修改也不是修改dog对象 所以输出xiaobai
看注释记住在面向对象的时候
变量 和 实际对象 是2个东西
var a = new Object; //创建了一个 变量a 和一个 对象object 同时a指向了object
a.name = 'xxx'; //这个时候 .运算符 是对 a指向的 object的操作
a = new Object(); //这个时候是对 a变量本身的操作 a指向了你又创建的一个新对象 这个时候有 2个object 但是a指向第2个
obj.name = "xiaobai"; //给obj属性赋值
obj = new Object(); //obj指向新对象
obj.name = "xiaohei"; //给obj属性赋值
}
具体到你的代码:
setName(dog)的具体执行步骤是:
0 函数开始:
1 (setName(dog))=>复制变量dog的指针给obj,使得obj和dog共同指向(引用)同一个对象(即你创建的那个空对象)。
2 (obj.name = "xiaobai";)=>给obj和dog共同引用的空对象添加值为“xiaobai”的name属性。
3 (obj = new Object();)=>切断obj和原对象之间的联系,让obj引用一个新的空对象。这里要注意的是:虽然obj不再引用原对象,但是dog和原对象之间的联系并未切断,因此dog仍然保持者对原对象的引用,只不过此时的原对象具有了一个值为“xiaobai”的name属性。
4 (obj.name = "xiaohei";)=>因为obj现在引用的是一个新的空对象,所以这一步是给新对象添加name属性,属性值“xiaohei”
5 函数执行完毕。所以在函数执行完后,dog引用的依然是原来的对象,自然会弹出“xiaobai”。所谓“按引用传递”本质上是:给参数传值得变量和参数是相互独立的。(个人理解 仅供参考)