阵列副本的变异也会变异原始阵列!为什么?

时间:2020-04-18 12:51:10

标签: javascript arrays

我具有以下功能,可以将矩阵旋转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 ===阵列)时,两个阵列(resultArr和array)都发生了变异它给了我错误。

您可以在此处看到: Capture of both arrays in the debbuger

有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

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

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));

答案 1 :(得分:0)

数组变量实际上并不像其他数字或字符变量那样指向存储在其中的值。 它存储存储阵列值的存储位置的基地址。因此,如果您使用

进行复制
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

我认为您理解了您为什么从比较中得出错误的结论。