我有一个反转数组的函数: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);
慕码人2483693
TA贡献1860条经验 获得超9个赞
当你这样做时,arr = output
你reverseArr
指的是一个新数组。换句话说,arrayValue
在外部上下文中并arr
指的是两个不同的对象。
您无法更改调用该函数所使用的变量的值。如果你有一个对象的引用,你可以改变它,但你不能让外部变量引用另一个对象。
胡说叔叔
TA贡献1804条经验 获得超8个赞
基本上,您的第一个函数就地反转列表(即直接对列表本身进行操作,而不构建新列表),而第二个函数通过构建内容相反的新列表来异地反转列表的原始列表。
就地工作时,您在array
函数内部所做的更改将直接应用于arrayValue
.
无法按您预期的方式工作的原因arr = output
几乎与其他答案所指的相同。即,arr
和arrayValue
是两个不同的引用(“指针”)。最初,当调用该函数时,arrayValue
和都arr
“指向”同一个数组。然而,arr = output
它arr
指向新建的列表output
。
添加回答
举报
0/150
提交
取消