【问题标题】:Mutation of an array's copy also mutates the original array! Why? [duplicate]数组副本的变异也会改变原始数组!为什么? [复制]
【发布时间】:2020-04-18 12:51:10
【问题描述】:

我有以下函数将矩阵旋转 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) 都会发生变异它给了我错误。

正如您在此处看到的: Capture of both arrays in the debbuger

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

【问题讨论】:

  • 看起来你有一个数组数组。制作源数组的副本会复制行引用,但它不是 deep 副本。您必须复制两个维度。
  • @Pointy 我不确定我是否理解,您能否将我链接到解释其在 Javascript 中如何工作的文章或视频?谢谢你的回复:)
  • JavaScript 中的二维数组是一个数组,每个元素都是一个数组。您必须使用.slice() 复制外部数组的每个元素,以便您拥有两个维度的完整副本。

标签: javascript arrays


【解决方案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));

【讨论】:

    【解决方案2】:

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

    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
    

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

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 2019-07-27
      • 2021-04-01
      • 2020-10-04
      • 1970-01-01
      • 2021-11-18
      • 2021-11-18
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多