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

Javascript 为什么使用切片克隆列表会影响原始列表,javascript,arrays,Javascript,Arrays,下面是我将数组中的对象更改为字符串的代码。无法理解它为什么会影响原始数组。如果我是对的,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", ObjTo

下面是我将数组中的对象更改为字符串的代码。无法理解它为什么会影响原始数组。如果我是对的,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 on

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

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

在您的例子中,即使在切片之后,原始数组和克隆数组中的每个数组元素都引用内存中相同的集群对象

原始克隆
+-----+                        +-----+

|0 |-->集群对象1集群对象2集群对象3正如@thefourtheye所解释的,您正在创建数组的浅层副本。要深入复制阵列项并修改状态,可以与一起使用:


我没看到你克隆任何东西!克隆的是原始列表的直接引用。是否有办法复制阵列我想要的是原始阵列不受影响,我应该得到同一阵列的临时副本,按照修改itI后需要发布的方式,我尝试使用$.extend,但它似乎只能克隆对象而不能克隆阵列,而数组也是objects@SaurabhTiwari最好的方法是编写一个克隆ClusterObject的函数,然后像这样调用它
var clonedArray=original.map(cloneCluster)
ObjToPost.MO = $scope.selected.items.map(function(cluster) {
    return angular.merge({}, cluster, { status: cluster.status.name }); // create a deep copy of each item, and override status with status.name
});