通过引用传递或通过值传递

时间:2012-10-24 11:39:30

标签: javascript object

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 个答案:

答案 0 :(得分:3)

对象的引用传递给方法。在第一个示例中,您将修改引用以指向其他对象,而不是尝试更改引用所指向的对象,因此,在该方法之外不会显示更改。

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

答案 1 :(得分:3)

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

change(o);
现在你调用函数更改和类型变量o的javascript检查它是'对象'实际上它应该是'指向对象的引用'所以对象{a:1}的引用通过方式转换为函数更改如果变量是原始的,它将仅通过值

function change(myObj){
现在函数更改默认创建变量myObj,其类型为'undefined',然后更改为'object',因为它有参考参数,现在变量myObj是一个指向对象'1A'的参考变量=> {a:1}和myObj仅在功能更改时可见 和全局变量o可能仍然指向对象'1A'=> {a:1}如果myObj只是对象'1A'=>的引用副本{a:1}按语言设计

myObj={};
现在引用变量myObj指向新的匿名空对象{}将此对象命名为'2B'

myObj.a=2; }
现在你使用引用myObj来设置对象'2B'=> {}使用值= 2的新属性a 并结束意味着全局无法看到对象的函数范围'2B'=> {a2}

alert(o.a); //alert 1
变量仍然指向或可能指向对象{a:1},参考o不能丢失它,因为对象'2B'=>在功能改变之外不能看到{a:2}并且将被垃圾收集破坏,因为它丢失了参考号和对象'1A'=> {a:1}无法通过垃圾收集来销毁,因为变量o仍然指向为什么你调用o你收到对象'1A'=> {a:1}


对不起我的语法错误,但我尽力使其易于阅读。

答案 2 :(得分: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. 

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

答案 3 :(得分:0)

在示例1中,您更改myObj引用的内容,因此您最终会更改与您想要的对象不同的对象。当

alert(o.a);

被执行,o.a自对象声明以来没有被更改,因此返回1。我希望有所帮助。另外阅读本文,它应该清除一些内容,在我第一次学习JavaScript时帮助我:http://www.snook.ca/archives/javascript/javascript_pass/