【问题标题】:Pass by reference vs Copy of reference通过引用传递与引用副本
【发布时间】:2020-07-11 13:11:46
【问题描述】:

我已经理解pass by reference这个概念了。
但是,copy of reference 的概念让我有点困惑。

这两个引用传递引用复制有什么区别吗?

var user={
   name:"xxx"
}

function update(ref) {
  ref = {
     dep:"yyy"
  };
}

update(user);

使用上述代码时,为什么没有重新初始化user对象?

当我按如下方式更新现有属性时:

ref.name='modified'

它更新user 对象。

另外,如果我可能会问,重构的代码是否传递了引用副本

【问题讨论】:

    标签: javascript object variables arguments


    【解决方案1】:

    与是否通过引用传递变量无关。

    事实上,问题在于您在ref 中放置了另一个对象,它不再指向存储在user 变量中的同一个对象。

    function update(ref) {
    
      //In this line we are reinitializing the value of ref with another object
      ref = {
        dep: "yyy"
      };
      ref.name = 'modified';
    }
    

    演示:

    让我们看看这个sn-p的区别:

    var user = {
      name: "xxx"
    }
    
    function update(ref) {
      //Here we are updating ref/user 
      ref.before = "a value";
      
      //And in this line we are reinitializing the value of ref with another object
      ref = {
        dep: "yyy"
      };
      ref.name = 'modified';
      console.log('This is ref value: ');
      console.log(ref);
    }
    update(user);
    console.log('This is user value: ');
    console.log(user);

    JS 函数中的参数:

    关于如何将参数传递给函数(通过引用或通过值),原语和对象之间存在差异,您可以阅读MDN Functions Docs,它说:

    原始参数(如数字)按值传递给函数;值被传递给函数,但如果函数改变了参数的值,这种变化不会在全局或调用函数中反映出来。

    如果您传递 一个对象(即一个非原始值,例如 Array 或 用户定义的对象)作为参数,函数改变 对象的属性,该更改在函数外部可见

    【讨论】:

      【解决方案2】:

      如果变量ref是对某个对象obj的引用,那么ref中的值就是obj的内存地址。复制ref,我们称之为ref2,只会创建另一个变量,其中存储了相同的内存地址。所以传递引用或引用的副本是一回事。

      通过value 和通过reference 传递会不一样。这两者之间的区别在网上有很好的记录。

      【讨论】:

      • 现在,我对参考副本有了一个想法。但它仍然让我感到困惑。我已经更新了我的问题
      猜你喜欢
      • 2018-04-24
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 2013-09-10
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多