【问题标题】:Pass by Value and Pass by Reference in JavascriptJavascript中的值传递和引用传递
【发布时间】:2018-05-27 17:19:53
【问题描述】:

现在我已经在 Angular2 上工作了将近 3 个月,我遇到了一些场景,这让我想知道这是怎么发生的?

对于特殊的this 关键字,很明显它传递了相关DOM ObjectClass 的引用或实例,例如。

但是还有一个叫做ControlGroup 的东西,只要它被分配给另一个变量,它也会做同样的事情。并且这两个变量都可以访问该ControlGroup 的同一实例。

【问题讨论】:

    标签: typescript angular


    【解决方案1】:

    对象和数组通过引用传递。数字、字符串、布尔值等原始值是按值传递的。对对象的引用也是原始类型,与其他原始类型一样是按值传递的,但它所引用的对象仍然是按引用传递的。

    这不是 Angular 或 TypeScript 特定的,而是 JavaScript 的工作原理。

    【讨论】:

    • 更多信息在这里 - 可以说它通过值传递引用stackoverflow.com/q/518000/314291
    • 确定引用是原始值,并且在传递时作为值传递,但引用所指的内容因此通过引用传递。我会更新我的答案。
    • 从来没有听说过这样的事情。你能在 Plunker 中复制吗?
    • 我以为我在 Typescript 中通过引用传递 Javascript 对象时遇到问题,直到我意识到我传递该对象的函数设置了对象的值,从而实际上用新对象替换了它,因此它与我传递给函数的对象不是同一个对象,而且我无法期望调用代码会看到新值。
    • 因此,如果我将一个对象(不是原语)传递给一个函数,并修改其中一个是 3 个以上引用的成员,并且不返回它,那么所有生成的对象都应该保持他们的更新?
    【解决方案2】:

    调整如果你知道你在做什么,可能如下:

    伪代码:

    foo() {
      int num = 1;
      bar(num);
      // num is 2!!
    }
    bar(int arg byRef) {
      arg = 2
    }
    

    打字稿:

    function foo() {
      let num = 1;
      (() => {
        const ret = bar(num) as any;
        num = ret.arg;
      })();
      // num is 2!!
    }
    function bar(arg) {
      arg = 2;
      return { arg };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-23
      • 2015-05-23
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多