我写了一个简单的函数来覆盖数组,如下所示:
function overwrite(arr) {
let temp = [3, 2, 1];
arr = temp;
}
let myarray = [1, 2, 3];
overwrite(myarray);
console.log(myarray);
[ 1, 2, 3 ]
控制台输出仍显示原始数组。怎么样?
顺便说一下,我确实弄明白了怎么做。我觉得上面的方法应该有效,但没有,所以我很想知道为什么。
答案 0 :(得分:3)
您移交数组的对象引用,并在overwrite
的本地范围内分配数组。
要更新原始数组,您需要清空数组并拼接值。
function overwrite(arr) {
let temp = [3, 2, 1];
arr.splice(0, arr.length, ...temp);
}
let myarray = [1, 2, 3];
overwrite(myarray);
console.log(myarray);
答案 1 :(得分:0)
以下是它在场景背后的工作原理:
myarray包含[1,2,3]的记忆参考,为清楚起见,我们将其命名为& myarray 。 现在当你将myarray传递给函数overwrite()时,javascript引擎会将& myarray 分配给 arr (类似于:arr =& myarray;)。所以,在这一步中你有这样的东西:
myarray = &myarray;
arr = &myarray;
当你为arr分配temp时,你基本上做的是:
arr = &temp; // You're changing where arr point to, not myarray
所以myarray 仍然指向& myarray (对[1,2,3]的引用)和arr指向& temp(对[3,2,1]的引用),这就是价值没有改变的原因。
以下是可视化我所解释的内容的插图: