为什么数组值仅在第一个函数之后才更改?

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


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;

有人可以解释一下为什么吗?


幕布斯7119047
浏览 165回答 3
3回答

元芳怎么了

基本上你用一个新数组let output = [];然后将新数组分配给参数arrarr = output;现在您有两个对象引用,一个arr是外部作用域,另一个是新的output.为了克服这个问题,您需要保留 的对象引用array。要在现有数组中获取新内容,您可以清空数组并推送新数组的值。arr.length = 0;arr.push(...output);

慕码人2483693

当你这样做时,arr = output你reverseArr指的是一个新数组。换句话说,arrayValue在外部上下文中并arr指的是两个不同的对象。您无法更改调用该函数所使用的变量的值。如果你有一个对象的引用,你可以改变它,但你不能让外部变量引用另一个对象。

胡说叔叔

基本上,您的第一个函数就地反转列表(即直接对列表本身进行操作,而不构建新列表),而第二个函数通过构建内容相反的新列表来异地反转列表的原始列表。就地工作时,您在array函数内部所做的更改将直接应用于arrayValue.无法按您预期的方式工作的原因arr = output几乎与其他答案所指的相同。即,arr和arrayValue是两个不同的引用(“指针”)。最初,当调用该函数时,arrayValue和都arr“指向”同一个数组。然而,arr = output它arr指向新建的列表output。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript