调用两次javascript函数的问题

Gab*_*ant 5 javascript arrays iteration loops

我正在尝试编写一个相当简单的Javascript函数,并且在迭代函数时遇到我不理解的行为.

我已将问题归结为以下情况.我想编写一个函数,将一个由数组数组组成的数组作为输入,例如A = [[[1]]].我不知道这个的标准术语,所以我将主数组称为"级别0",其中元素是"级别1"的数组.我会说1级数组由"2级"数组组成.2级数组由整数组成.

该函数在输入A(0级数组)上执行以下操作:

  1. 创建一个空数组L;
  2. 每个级别1阵列MA
    • 为每个2级数组中的每个整数条目添加一个M;
    • 增加的两个副本M,以L
  3. 回来L.

这是我的代码:

function myFunc(A){
  var L = [];
  for(var a=0; a<A.length; a++){
    var M = A[a].slice(0);
    for(var i=0; i<M.length; i++){
      for(var j=0; j<M[i].length; j++){
        M[i][j]++;
      }
    }
    for(var s=0; s<2; s++){
      var N = M.slice(0);
      L.push(N);
    }
  }
  return(L);
}
Run Code Online (Sandbox Code Playgroud)

现在我测试一下:

var A = [[[1]]];

A = myFunc(A)
Run Code Online (Sandbox Code Playgroud)

在此之后,我得到了A = [[[2]],[[2]]],这是我所期待的.但是,假设我迭代它:

var A = [[[1]]];

A = myFunc(A);

A = myFunc(A);
Run Code Online (Sandbox Code Playgroud)

然后我希望获得A = [[[3]],[[3]],[[3]],[[3]]],但相反,我有A = [[[4]],[[4]],[[4]],[[4]]].

另一方面,如果我跑myFunc([[[2]],[[2]]]),我确实得到了预期[[[3]],[[3]],[[3]],[[3]]].

我不明白这种差异来自何处.

Tri*_*eur 5

问题是这条线:

M[i][j]++;
Run Code Online (Sandbox Code Playgroud)

Node将此作为对A切片的引用,当您执行此操作时,您会清楚地看到它:

x = [[[1]]];
myFunc(x);
myFunc(x);
console.log(x); // ---> [[[3]]]
Run Code Online (Sandbox Code Playgroud)

对于浅拷贝,你必须使用这个JSON.parse(JSON.stringify())技巧,并证明M是问题; 在M = A[a].slice(0);解决问题后添加此行.

M = JSON.parse(JSON.stringify(M))
Run Code Online (Sandbox Code Playgroud)

Mozilla的文档Array.prototype.slice():

对于对象引用(而不是实际对象),slice将对象引用复制到新数组中.原始数组和新数组都引用相同的对象.如果引用的对象发生更改,则更改对新的和原始数组都可见.

资源

这就是为什么,因为当你这样做时M[i][j],更深层次的数组仍在外面引用.