【问题标题】:Pass by reference or pass by value按引用传递或按值传递
【发布时间】:2012-10-14 10:47:15
【问题描述】:

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 object


【解决方案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. 

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不,就像 java 中的引用。在 C 中,如果您将指针传递给方法,将指针更改为指向不同的内存位置,则该更改在被调用方法中可见。
    【解决方案3】:

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

    alert(o.a);
    

    被执行,o.a 自从对象声明以来没有改变,所以返回 1。我希望这会有所帮助。另请阅读这篇文章,它应该会理清一些事情,在我第一次学习 JavaScript 时帮助了我:http://www.snook.ca/archives/javascript/javascript_pass/。

    【讨论】:

      【解决方案4】:

      我会彻底解释这个

      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 的引用变量仅在功能更改中可见 并且全局变量 o 可能仍然指向对象 '1A' => {a:1} 如果 myObj 只是语言设计对对象 '1A' => {a:1} 的引用的副本

      @987654324 @
      现在引用变量 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-01-16
        • 2019-05-07
        • 2012-03-12
        • 2013-09-15
        • 1970-01-01
        • 2014-08-23
        • 2015-05-23
        • 1970-01-01
        相关资源
        最近更新 更多