【问题标题】:Why array value is changed only after first function?为什么数组值仅在第一个函数后更改?
【发布时间】:2020-11-13 19:05:13
【问题描述】:

我有一个反转数组的函数:

function reverseArray(array) {
  for(let i = 0; i <= Math.floor(array.length / 2); i++) {
    let old = array[array.length - 1 - i];
    array[array.length - 1 - i] = array[i];
    array[i] = old;
  }
  return array;
}

以及一个创建本地范围数组并以相反顺序推送值的函数:

function reverseArr(arr) {
  let output = [];
  for(let i of arr) {
    output.unshift(i);
  }
  arr = output;
  return arr;
}

假设有一个元素:

let arrayValue = [1, 2, 3, 4, 5];

如果我以 arrayValue 作为参数调用第一个函数,arrayValue 会改变:

reverseArray(arrayValue); // [5, 4, 3, 2, 1]
console.log(arrayValue); // [5, 4, 3, 2, 1]

但是,如果我使用 arrayValue 调用第二个函数:

reverseArr(arrayValue); //[5, 4, 3, 2, 1]
console.log(arrayValue); //[1, 2, 3, 4, 5]

即使我在返回之前将反转的值分配给参数,arrayValue 也不会改变:

arr = output;

谁能解释一下为什么?

提前致谢。

【问题讨论】:

  • 我不认为unshift 做你认为它做的事。阅读developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 另见here,它描述了使用push的更好方法。
  • @RobertHarvey 嗯.... unshift() 是在这里使用的正确方法.... OP 正在反转一个数组,因此它附加到前面,您的建议是将它添加到末尾.....所以OP会得到相同的数组顺序,因为循环不会倒退......
  • JS 是 pass-by-value,当您执行 arr = output 时,您只是重新分配了局部变量 arr。您不会替换它曾经引用的数组,也不会影响仍然引用该数组的其他变量 (arrayValue)。在您的第一个示例中,您正在直接改变该数组。

标签: javascript arrays function


【解决方案1】:

基本上你用一个新数组

let output = [];

然后你将新数组分配给参数arr

arr = output;

现在您有两个对象引用,一个是外部作用域的arr,另一个是output

要克服这个问题,您需要保留array 的对象引用。要在现有数组中获取新内容,您可以清空数组并推送新数组的值。

arr.length = 0;
arr.push(...output);

【讨论】:

    【解决方案2】:

    当您在reverseArr 中执行arr = output 时,您指的是一个新数组。换句话说,外部上下文中的arrayValuearr 指的是两个不同的对象。

    您不能更改调用函数的变量的值。如果你有一个对象的引用,你可以改变它,但你不能让外部变量引用另一个对象。

    【讨论】:

      【解决方案3】:

      基本上,您的第一个函数就地反转列表(即直接对列表本身进行操作,而不构建新列表),而第二个函数反转列表out-of-place,通过构建一个新列表,其内容与原始列表相反。

      在原地工作时,您在函数内对array 所做的更改将直接应用于arrayValue

      arr = output 无法按您预期的方式工作的原因几乎与其他答案所指的一样。也就是说,arrarrayValue 是两个不同的引用(“指针”)。最初,arrayValuearr 在调用函数时都“指向”同一个数组。但是,arr = output 使arr 指向新建的列表output

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-27
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2022-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多