0

javascript中的对象是否通过引用传递?如果是,为什么此代码不起作用。

function change(myObj)
{
 myObj={};
 myObj.a=2;
}
 o={a:1};
change(o);
alert(o.a); //alert 1

但是当我这样做时

function change(myObj)
{

 myObj.a=2;
}
 o={a:1};
change(o);
alert(o.a); //alert 2
4

4 回答 4

3

对对象的引用被传递给方法。在您的第一个示例中,您正在修改引用以指向不同的对象,而不是尝试更改引用指向的对象,因此,更改在该方法之外不可见。

在您的第二个示例中,您正在更改引用指向的对象的状态,myobj因此在方法之外是可见的。

于 2012-10-24T11:42:38.457 回答
3

我将

o={a:1};
首先彻底解释这一点,您将全局变量 o 设置为具有属性变量 a 且值 = 1 的新匿名对象的引用,将此对象 {a:1} 命名为“1A”,

change(o);
现在您调用函数更改和 javascript 检查typeof 变量 o 并且它是“对象”,
实际上它应该是“指向对象的引用”,因此对象 {a:1} 的引用被传递到函数更改中,如果变量是原始的,它只会按值传递

function change(myObj){
现在函数更改默认情况下使用 typeof 'undefined' 创建变量 myObj 然后更改为 'object' 因为它有引用参数,现在变量 myObj 是指向对象 '1A' => {a:1} 和 myObj 的引用变量仅在函数更改和全局变量中

myObj={};
可见引用变量 myObj 指向新的匿名空对象 {} 将此对象命名为“2B”

myObj.a=2; }
现在您使用引用 myObj 设置对象 '2B' => {} 以具有值 = 2 的新属性 a 并结束意味着全局无法看到对象 '2B' => {a:2}

alert(o.a); //alert 1
变量的函数范围指向或可能指向对象 {a:1} ,引用 o 不能丢失它,
因为对象 '2B' => {a:2} 在函数更改之外看不到
,将被垃圾回收销毁因为它丢失了引用
和对象 '1A' => {a:1} 不能被垃圾收集销毁,
因为变量 o 仍然指向它,你为什么调用 o 你会收到对象 '1A' => {a:1}


抱歉我的语法不好,但我尽我所能使它易于阅读。

于 2012-10-24T17:26:42.623 回答
2

在这种情况下,您将覆盖对实际对象的引用。

function change(myObj)
{
 myObj={}; //overwriting the reference in myObj here.
 myObj.a=2;
}
 o={a:1};
change(o);
alert(o.a); //alert 1

这样想:

function change(myObj = referenceToObjectPassedIn)
 myObj = new Object() ; 
  // referenceToObjectPassedIn lost in limbo
 myObject.a = 2;   //modifying newly created object. 

要解决您的问题,您必须返回新对象。

于 2012-10-24T11:42:27.107 回答
0

在示例 1 中,您更改了 myObj 引用的内容,因此您最终更改了与您想要的对象不同的对象。什么时候

alert(o.a);

执行时,自对象声明后 oa 未更改,因此返回 1。我希望这会有所帮助。还阅读了这篇文章,它应该清楚一些事情,在我第一次学习 JavaScript 时帮助了我:http ://www.snook.ca/archives/javascript/javascript_pass/ 。

于 2012-10-24T11:58:14.667 回答