JavaScript嵌套循环意外结果

JavaScript嵌套循环意外结果,javascript,nested-loops,Javascript,Nested Loops,我希望下面的代码返回结果(矩阵) [[0,0],[0,0,0,0],[0,0,0,0,0]] function zeroArray(m, n) { let newArray = []; let row = []; for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { row.push(0); } newArray.push(row); } return

我希望下面的代码返回结果(矩阵)

[[0,0],[0,0,0,0],[0,0,0,0,0]]

function zeroArray(m, n) {
  let newArray = [];
  let row = [];
  for (let i = 0; i < m; i++) {
    
    for (let j = 0; j < n; j++) {
      row.push(0);
    }
    newArray.push(row);
  }
  return newArray;
}

let matrix = zeroArray(3, 2);
console.log(matrix);
函数零数组(m,n){
设newArray=[];
设row=[];
for(设i=0;i
但它的回报是: [0,0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0]]

function zeroArray(m, n) {
  let newArray = [];
  let row = [];
  for (let i = 0; i < m; i++) {
    
    for (let j = 0; j < n; j++) {
      row.push(0);
    }
    newArray.push(row);
  }
  return newArray;
}

let matrix = zeroArray(3, 2);
console.log(matrix);
我看不出外部循环每次迭代时,
的[0,0,0,0,0]值是多少

我看到
row
在每个实例上从[0,0]迭代到[0,0,0,0]迭代到[0,0,0,0,0],并推到
newArray
。然而,这显然是错误的


有人能给我解释一下这个结果吗?

你可以推送一份
行的副本。这将消除相同的对象引用

函数零数组(m,n){
设newArray=[];
设row=[];
for(设i=0;i控制台日志(矩阵)您可以推送
行的副本
。这将消除相同的对象引用

函数零数组(m,n){
设newArray=[];
设row=[];
for(设i=0;i控制台日志(矩阵)对每个n值运行内部循环,然后对输出循环中的每个m值再次运行


对于M中的每个数字>运行N中的每个数字并按到第行。3*2在该表中给出了6个结果。

您的内循环针对每个n值运行,然后再针对外循环中的每个m值运行


对于M中的每个数字>运行N中的每个数字并按到第行。3*2在该表中给出了6个结果。

根据您的输出,内循环中的边界检查是错误的,在外循环的每次迭代中,分配一个新的
i*2
长度数组

您可以使用来进一步简化代码

函数零数组(m,n){
常量newArray=[];

对于(设i=1;i根据您的输出,内循环中的边界检查是错误的,在外循环的每次迭代中分配一个新的
i*2
长度数组

您可以使用来进一步简化代码

函数零数组(m,n){
常量newArray=[];

for(设i=1;i发生这种情况是因为数组是JavaScript中的引用类型(这意味着当您执行
newArray.push(row)
时,您只会将引用推送到
row
,因此当其值更改时,它会到处更改).好的,我明白了!我可以看出这是您需要注意的东西..按值或按引用连锁反应。我不完全知道在推入数组后引用一直保留在变量中,我认为这是新的内存空间..但显然不是。感谢发生这种情况,因为数组是JavaScript中的引用类型(这意味着当您执行
newArray.push(row)
操作时,您只会将引用推送到
,因此当其值更改时,它会到处更改).好的,我明白了!我可以看出这是你需要注意的东西..按值或按引用连锁反应.我没有完全意识到在放入数组后引用一直保留在变量中,我认为这是新的内存空间..但显然不是.谢谢