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
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
对对象的引用被传递给方法。在您的第一个示例中,您正在修改引用以指向不同的对象,而不是尝试更改引用指向的对象,因此,更改在该方法之外不可见。
在您的第二个示例中,您正在更改引用指向的对象的状态,myobj
因此在方法之外是可见的。
我将
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}
抱歉我的语法不好,但我尽我所能使它易于阅读。
在这种情况下,您将覆盖对实际对象的引用。
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.
要解决您的问题,您必须返回新对象。
在示例 1 中,您更改了 myObj 引用的内容,因此您最终更改了与您想要的对象不同的对象。什么时候
alert(o.a);
执行时,自对象声明后 oa 未更改,因此返回 1。我希望这会有所帮助。还阅读了这篇文章,它应该清楚一些事情,在我第一次学习 JavaScript 时帮助了我:http ://www.snook.ca/archives/javascript/javascript_pass/ 。