为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2023-08-05 20:40:52
我有一个反转数组的函数: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;有人可以解释一下为什么吗?
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

基本上你用一个新数组


let output = [];

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


arr = output;

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


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


arr.length = 0;

arr.push(...output);


查看完整回答
反对 回复 2023-08-05
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

当你这样做时,arr = outputreverseArr指的是一个新数组。换句话说,arrayValue在外部上下文中并arr指的是两个不同的对象。

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


查看完整回答
反对 回复 2023-08-05
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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

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

无法按您预期的方式工作的原因arr = output几乎与其他答案所指的相同。即,arrarrayValue是两个不同的引用(“指针”)。最初,当调用该函数时,arrayValue和都arr“指向”同一个数组。然而,arr = outputarr指向新建的列表output


查看完整回答
反对 回复 2023-08-05
  • 3 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信