为什么使用切片克隆列表会影响原始列表

2023-12-12

下面是我将数组内的对象更改为字符串的代码。无法弄清楚为什么它会影响原始数组。 slice 应该克隆数组,如果我是对的?

var cloned = $scope.selected.items.slice(0);
cloned.forEach(function (cluster) {
  cluster.status = cluster.status.name;
})
ObjToPost.MO = cloned;
console.log("consoling the cluster list", ObjToPost.MO);
console.log("consoling the original cluster list", $scope.selected.items);

安慰后两个数组是相同的


引用 MDN 上的Array.prototype.slice,

The slice()方法将数组的一部分的浅拷贝返回到新的数组对象中。

这里重要的词是“浅拷贝”。它创建一个新数组并使数组的元素指向同一个对象。

在您的情况下,即使在切片之后,原始数组和克隆数组中的每个数组元素都引用内存中相同的簇对象。

Original                        Cloned
+-----+                        +-----+
|  0  |--> Cluster Object 1 <--|  0  |
+-----+                        +-----+
|  1  |--> Cluster Object 2 <--|  1  |
+-----+                        +-----+
|  2  |--> Cluster Object 3 <--|  2  |
+-----+                        +-----+

由于所有相应的元素都引用相同的对象,因此通过一个数组对其进行更改也会反映在另一个数组中。

Note:如果您正在寻找一种进行深复制的方法,那么您可能需要检查这个问题.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用切片克隆列表会影响原始列表 的相关文章

随机推荐