关于javascript中的参数传递疑问

var obj = {x : 1};
function foo(o) {
    o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了!

此时 obj 的值被修改,下面的代码让我很迷茫

var obj = {x : 1};
function foo(o) {
    o=new object();
    o.x = 3;
}
foo(obj);
console.log(obj.x); // 1,没有被修改!

暂时只了解到对对象的传参是一种共享传递,函数接受对象实参引用的副本,虽然引用是副本,引用的对象是相同的。它们共享相同的对象,所以修改形参对象的属性值,也会影响到实参的属性值。
但是new object() 之后就不行了,难道new object()之后会切断它与这个对象的联系?

阅读 2.5k
2 个回答
o=new object();

其实就是一种重新赋值的操作,相当于你给o变量重新赋值为{},此时foo里面的参数o就引用不到了;
如果你还想引用o,你可以这么做:

var obj = {x : 1};
function foo(o) {
    var temp = o; //将o保存在变量temp中
    o=new object();
    o.x = 3;
}
foo(obj);
console.log(obj.x); // 1,没有被修改!
var obj = {x : 1};
function foo(o) {
    o.x = 3;
}
foo(obj); // 把指向 obj 对象的引用传进 foo 函数,局部变量名是 obj ,然后修改这个 obj 所指向对象的 x 值,因为内部局部变量 obj 所指向的对象和外部 obj 所指向的对象是同一个对象,故最后结果被修改
console.log(obj.x); // 3, 被修改了!
var obj = {x : 1};
function foo(o) {
    o=new object();
    o.x = 3;
}
foo(obj); // 把指向 obj 对象的引用传进 foo 函数,变量名也是 obj ,然后对这个变量进行赋值为一个对象,然后对这个对象进行属性赋值。执行结束后引用变量被回收,但是外部的变量并不会受到影响。
console.log(obj.x); // 1,没有被修改!
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏