嵌套循环中数组的意外值

时间:2018-12-05 17:00:43

标签: javascript

在练习循环时,我对结果感到有些奇怪。

let a = [];
let b = [];

for (let i=0; i<2; i++){
  for (let j=0; j<2;j++){
      a.push(0);

  }
  b.push(a);
  console.log(a);
  console.log(b);
}

输出看起来像这样:

//values of arrays after first iteration of outside loop
[ 0, 0 ]
[ [ 0, 0 ] ]
//values of arrays after second...
[ 0, 0, 0, 0 ]
[ [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ]

我想知道为什么数组b的值不等于[ [0, 0], [0, 0, 0, 0] ]

1 个答案:

答案 0 :(得分:1)

基本上,您始终使用相同的a数组。

在第二次迭代开始时,a[0, 0],您在那里再增加2个数字。

b的末尾基本上是[a, a],因此,如果您继续喂a 0,它的元素将会持续增长。

如果要创建2D数组,则必须进行一些小的修改:

let b = [];

for (let i=0; i<2; i++){
  let a = [];
  for (let j=0; j<2;j++){
      a.push(0);

  }
  b.push(a);
  console.log(a);
  console.log(b);
}

let a的创建移到外部循环意味着每次循环时,您都会创建一个新的临时a,随后将其推到b

要获得所需结果,您需要复制数组a,而不是复制它:

let a = [];
let b = [];

for (let i=0; i<2; i++){
  for (let j=0; j<2;j++){
      a.push(0);
}
  b.push(a.slice());
  console.log(a);
  console.log(b);
}