数组副本的突变也会改变原始数组!为什么?



我有以下函数可以将矩阵旋转90度,这是代码

function rotateMatrix(array) {
let counter = 0;
let resultArr = array.slice();
let i = 0,
k = 0,
p = 0;
j = array.length - 1;
console.log(array === resultArr); //false

while (counter <= Math.pow(array.length, 2)) {
if (i < array.length) {
resultArr[k][p] = array[i][j];
i++;
p++;
} else {
j--;
k++;
i = 0;
p = 0;
}
}
return resultArr;
}

尽管每当我试图对resultArr进行变异以插入旋转矩阵的值时,我都会创建一个数组的副本,但这两个数组(resultArr&array(都会发生变异,当我比较(resultArr==array(时,它会给我错误。

如您所见:在解扰中捕获两个阵列

有人知道为什么会发生这种事吗?

如果你想创建一个全新的二维数组,你可以使用如下代码:

const array=[[1,2],[3,4]], array2=array.slice().map(el=>el.slice()); console.log(array2==array); // false console.log(array2[0]==array[0]); // false

const array=[[1,2],[3,4]], array2=Array.from(array).map(el=>Array.from(el));

数组变量实际上并不像其他数值或字符变量那样指向存储在其中的值。它存储存储数组值的存储位置的基地址。所以如果你用复制

var copyArray = actualArray.slice();

实际阵列的新副本被创建并存储在存储器的另一个位置中。此时,新的数组变量指向内存中复制数组的基地址。当你对这样的阵列进行比较时

array1 === array2

系统与存储在其中的值不匹配,而是与每个数组的基本内存地址匹配。两个内存位置根本不会有相同的地址。所以它会给出一个错误。

示例:

1

var ar1 = [];
var ar2 = [];
console.log(ar1 === ar2); // false

2

var ar1 = [];
var ar2 = ar1.slice();
console.log(ar1 === ar2); // false

3

var ar1 = [];
var ar2 = ar1;
console.log(ar1 === ar2); // true

我想你明白为什么你从比较中得到了错误。