数组覆盖无法按预期工作

时间:2018-03-12 20:28:44

标签: javascript arrays

我写了一个简单的函数来覆盖数组,如下所示:

function overwrite(arr) {
    let temp = [3, 2, 1];
    arr = temp;
}

let myarray = [1, 2, 3];
overwrite(myarray);
console.log(myarray);
[ 1, 2, 3 ]

控制台输出仍显示原始数组。怎么样?

顺便说一下,我确实弄明白了怎么做。我觉得上面的方法应该有效,但没有,所以我很想知道为什么。

2 个答案:

答案 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]的引用),这就是价值没有改变的原因。

以下是可视化我所解释的内容的插图:

enter image description here