我希望在使用 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']
}
切片产生浅数组的副本。它在文档中说:
slice((方法返回一部分数组的浅副本 进入一个新的数组对象,从头到尾选择(不包括结束(。 原始数组将不会被修改。
由于distances
是Arryas的数组,因此sampleDistance
将是浅副本,这意味着它将参考到相同的3(一维(数组。 sampleDistance[0][2] = ['fooo']
更改了第一个一维数组,该数组均由sampleDistance
和distances
引用。
因此您的错误。
用不确定深度的子数组项克隆一个数组,您需要一个通用数组克隆工具,例如;
Array.prototype.clone = function(){
return this.map(e => Array.isArray(e) ? e.clone() : e);
};
所以distances.clone()
应该可以做好工作。