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
答案 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/。