gpt4 book ai didi

javascript - 为什么本地数组的推送会改变全局数组?

转载 作者:行者123 更新时间:2023-11-30 09:20:52 25 4
gpt4 key购买 nike

我很困惑为什么下面这段代码会返回本地和全局数组的突变:

var globalarray = [1,2,3];

function test(){
let localarray = globalarray;
localarray.push(4);
console.log(localarray);
console.log(globalarray);
}
setInterval(test, 2000);

返回:

 [1,2,3,4] for both

我的印象是 localarrayglobalarray 的副本。我看到另一个答案说,为了制作数组的副本,您需要使用 .slice().reverse(),这似乎是一种解决方法。为什么它不只是创建一个新的本地副本?有没有一种简单有效的方法来制作全局数组的本地副本?否则,对全局数组进行多次更改似乎对性能来说很糟糕。

最佳答案

在您的代码中这样做的原因是因为您只是告诉您的 test 函数使用 = 运算符指向 globalarray。这是因为在 JavaScript 中,变量赋值并不会固有地将对象“复制”到新变量中;这可能看起来令人困惑,所以只需将 = 运算符视为将您的代码指向对象位置的标志。

只有当您使用 primitive types 时,= 运算符才会制作新副本。 .在这些情况下,您无法固有地更改这些对象是什么,因此 = 足以像您期望的那样制作副本。

.slice().reverse() 的原因是解决您遇到的问题。另一种方法是使用 let localarray = globalarray.map(e => e),或者按照 samee 的建议,使用 let localarray = [...globalarray].map 运算符将提供给它的函数作为第一个参数并将其应用于每个元素,然后将结果存储在另一个位置的不同数组中与 globalarray 不同。

请记住,这些方法以及可能向您建议的任何其他方法都是速记方法

let localarray = new Array(globalarray.length);
for (let i = 0; i < globalarray.length; i++) {
localarray[i] = globalarray[i];
}

// localarray can now be freely modified because it does not point to the same array as globalarray

另请记住,如果您还需要创建数组内部元素的副本,则必须使用更全面的复制代码。如果您真的需要,有些图书馆可以进行这种繁重的复制。

关于javascript - 为什么本地数组的推送会改变全局数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51804776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com