我希望在使用distances.slice()
后,我会得到一个数组的副本。但是当我更改新副本的元素时,它仍会更改原始数组。为什么呢?
var distances = [
['-1', '10', '-1', '31'],
['10', '-1', '10', '-1'],
['-1', '-1', '-1', '10'],
['15', '6', '-1', '-1']
];
for (var i = 0; i < 4; i++) {
console.log(distances, 'distances pairstop');
var sampleDistance = distances.slice()
sampleDistance[0][2] = ['fooo']
}
答案 0 :(得分:2)
切片生成数组的浅副本。 它在docs:
中这样说slice()方法返回数组部分的浅表副本 到从开始到结束选择的新数组对象(不包括结束)。 原始数组不会被修改。
由于distances
是一个arryas数组,sampleDistance
将是一个浅表副本,这意味着它将保持对相同的3(一维)数组的引用。
sampleDistance[0][2] = ['fooo']
更改了第一个一维数组,该数组由sampleDistance
和distances
引用。
因此你的错误。
答案 1 :(得分:0)
要克隆具有不确定深度的子数组项的数组,您需要一个通用的数组克隆工具,如:
Array.prototype.clone = function(){
return this.map(e => Array.isArray(e) ? e.clone() : e);
};
所以distances.clone()
应该做好工作。