【问题标题】:JavaScript - Array passed by reference but lost when reassignedJavaScript - 通过引用传递但重新分配时丢失的数组
【发布时间】:2016-09-12 01:02:32
【问题描述】:

在下面的JS代码中,为什么f3(arr2)没有像f2(arr1)那样把arr2的值改成arr1?有什么方法可以让f3 按预期工作(如果可能,不返回修改后的数组)?

var arr1 = [1, 2, 3, 4];
var arr2 = [1, 2, 3, 4];

function f1() {
    return [2, 3, 4, 5];
}

function f2(arr) {
    arr.push(5);
}

function f3(arr) {
    arr = f1();
}

f2(arr1);
console.log(arr1); // [ 1, 2, 3, 4, 5 ]

f3(arr2);
console.log(arr2); // [ 1, 2, 3, 4 ], expect [2, 3, 4, 5]

【问题讨论】:

  • arr in f3 只是一个引用,你应该splice 或使用类似的Array.prototype 方法来更改它引用的数组。

标签: javascript pass-by-reference


【解决方案1】:

如果你想修改数组,那么你实际上必须修改数组。您不能只在变量上写入对不同数组的引用(因为这只会丢弃对该数组的本地引用)。

function f3(arr) {
    arr.length = 0; // Empty the array
    f1().forEach(function (currentValue) { arr.push(currentValue); });
}

【讨论】:

    【解决方案2】:

    quote: "console.log(arr2); // [ 1, 2, 3, 4 ], expect [2, 3, 4, 5]"

    你没有得到你所期望的原因是这里的这部分

    function f3(*arr*) { *arr* = f1(); }

    您将数组 [2,3,4,5] 分配给函数 f3的参数名称 arr >,而不是arr2。 Arr2 当然在整个脚本中都保持不变并保持其原始状态。

    function f3(*arr*) { *arr2* = f1(); } 会做到的。

    但这个答案不是我的最终答案。这只是它的外观。

    【讨论】:

      【解决方案3】:

      您可以一步完成:

      Array.prototype.splice.apply(arr, [0, arr.length].concat(f1()));
      

      var arr1 = [1, 2, 3, 4];
      var arr2 = [1, 2, 3, 4];
      
      function f1() {
          return [2, 3, 4, 5];
      }
      
      function f2(arr) {
          arr.push(5);
      }
      
      function f3(arr) {
          Array.prototype.splice.apply(arr, [0, arr.length].concat(f1()));
      }
      
      f2(arr1);
      document.write('<pre>' + JSON.stringify(arr1, 0, 4) + '</pre>');
      
      f3(arr2);
      document.write('<pre>' + JSON.stringify(arr2, 0, 4) + '</pre>');

      【讨论】:

      • 这不是 op 要求的
      • @BekimBacaj,op 期待/询问什么?
      • 看起来,他期望一个 JavaScript 对象被分配给函数参数 (arr) 的(局部)变量名,以反映在他的全局 arr2 指向的指向方向上。他在问为什么?答案是:你的本地指针无法改变它从中学习的指针的指向方向。因为 arr2 只是告诉本地 arr [1,2,3,4] 对象在哪里。你不能通过改变载体的内容来改变信息的来源。
      【解决方案4】:

      当你传递任何东西(无论是对象还是原语)时,javascript 所做的只是在函数内部分配一个新变量...就像使用等号 (=)

      该参数在函数内的行为与您刚刚使用等号分配新变量时的行为完全相同。以这些简单的示例为例。 您可以参考:Link

      【讨论】:

        猜你喜欢
        • 2015-07-11
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 2020-12-06
        • 2010-10-06
        • 1970-01-01
        • 2012-10-07
        相关资源
        最近更新 更多