为什么列表上的推送/取消移位函数会影响 Javascript 中分配给该列表的其他列表?



在Javascript中,为什么列表中的推送和取消移位函数会影响数组分配到的其他数组?

例如,如果我有一个名为 list1 的数组和另一个名为 list2 的数组,我将 list1 分配给 list2,如下所示,并将一个值推入list1,为什么list2也会改变?

var list1 = [1,2,3];
var list2 = list1;
list1.push(4);
alert(list2);
// Alerts [1,2,3,4]

如果我将数组分配给list1,这是不同的。

var list1 = [1,2,3];
var list2 = list1;
list1 = [1,2,3,4];
alert(list2);
// Alerts [1,2,3]

有人可以帮忙吗?这是令人困惑的,根本没有意义。

原因是因为 Array 不是基元类型。这意味着,如果将数组分配给变量,则该变量将是指向位于堆内存中的数组的"指针"。因此,如果您将list2分配为list,您的意思是:"将 list2 设置为列表 1 的同一指针"。为了使克隆成为阵列,您可以这样做:

var list1 = [1,2,3];
var list2 = Array.from(list1);
list1 = [1,2,3,4];
alert(list2);
// Alerts [1,2,3,4];

在第二个示例中得到 [1,2,3] 的原因是您已将 list1 分配给新列表,而 list1 仍指向原始数组。

您可以在此处阅读有关基元和引用 tie 之间区别的更多信息 - 基元类型和引用类型之间有什么区别?

发生这种情况是因为数组是 JavaScript 中的引用类型。此问题的简单解决方案是将一个列表克隆到另一个列表,而不是分配。

例如,list2 = list1.slice(0);

最新更新