Javascript二维数组生成;“奇怪”;行为

Javascript二维数组生成;“奇怪”;行为,javascript,arrays,Javascript,Arrays,所以基本上我之前问过一个关于同一主题的问题,虽然我理解答案中的解决方案是如何工作的以及为什么工作的(我对此表示赞赏),但我无法理解代码不工作的原因。因此,该程序旨在生成一个二维数组,它应该复制一个乘法表。但是,行的值是重复的,而不是适当地不同 所以基本上,它产生 [ [3, 6, 9], [3, 6, 9], [3,6,9]]而不是预期的[[1,2,3], [2, 4, 6], [3, 6, 9] ]. 显然,在分配数组“行”(对应于arr2,由outerloop分配)之后,在循环的下一次重复

所以基本上我之前问过一个关于同一主题的问题,虽然我理解答案中的解决方案是如何工作的以及为什么工作的(我对此表示赞赏),但我无法理解代码不工作的原因。因此,该程序旨在生成一个二维数组,它应该复制一个乘法表。但是,行的值是重复的,而不是适当地不同

所以基本上,它产生 [ [3, 6, 9], [3, 6, 9], [3,6,9]]而不是预期的[[1,2,3], [2, 4, 6], [3, 6, 9] ]. 显然,在分配数组“行”(对应于arr2,由outerloop分配)之后,在循环的下一次重复中,不仅当前元素arr[j]受到影响,而且前面的元素也会随着arr2的更新(更改)值而更改/更新,即使没有(显式地?)处理并重新分配

alert语句说明了这一点,其中相同的索引元素在不同的循环中具有不同的值,即使它们应该被分配一次,并且在分配后不会因此而改变(至少据我所知,因为for循环只分配/索引了它们一次)。那么为什么在这种情况下会发生这种行为呢

代码如下:

<script>
    var arr = [];
    var arr2 =[];

    for (var j=0; j < 3; j++){
        for (var k=0; k<3; k++){
            arr2[k] = (k+1)*(j+1);
        }
        arr[j]=arr2;
        alert("arr[" + j + "]= " + arr[j]);
        alert("arr[" + (j-1) + "]= " + arr[j-1]);
    }

    alert("Finally: " + arr);
</script>

var-arr=[];
var arr2=[];
对于(var j=0;j<3;j++){
对于(var k=0;k请尝试以下操作:

var arr = [], // the array to hold the answer
    arr2, // another variable for inner array, note reset in loop below
    j, // declaring this outside of loop for better style
    k;

for (j=0; j < 3; j++){
    arr2 = []; // clear inner array each time
    for (k=0; k < 3; k++){
        arr2[k] = (j + 1) * (k + 1); // build inner array
    }
    arr[j] = arr2; // add the inner array after building it.
}

console.log(JSON.stringify(arr)); // because console.log lets us see more detail than alert.

alert("Finally: " + arr);
var arr=[],//保存答案的数组
arr2,//内部数组的另一个变量,注意下面循环中的reset
j、 //在循环外声明此项以获得更好的样式
K
对于(j=0;j<3;j++){
arr2=[];//每次清除内部数组
对于(k=0;k<3;k++){
arr2[k]=(j+1)*(k+1);//构建内部数组
}
arr[j]=arr2;//在构建内部数组之后添加它。
}
console.log(JSON.stringify(arr));//因为console.log让我们看到比警报更多的细节。
警报(“最后:+arr”);
尝试以下操作:

var arr = [], // the array to hold the answer
    arr2, // another variable for inner array, note reset in loop below
    j, // declaring this outside of loop for better style
    k;

for (j=0; j < 3; j++){
    arr2 = []; // clear inner array each time
    for (k=0; k < 3; k++){
        arr2[k] = (j + 1) * (k + 1); // build inner array
    }
    arr[j] = arr2; // add the inner array after building it.
}

console.log(JSON.stringify(arr)); // because console.log lets us see more detail than alert.

alert("Finally: " + arr);
var arr=[],//保存答案的数组
arr2,//内部数组的另一个变量,注意下面循环中的reset
j、 //在循环外声明此项以获得更好的样式
K
对于(j=0;j<3;j++){
arr2=[];//每次清除内部数组
对于(k=0;k<3;k++){
arr2[k]=(j+1)*(k+1);//构建内部数组
}
arr[j]=arr2;//在构建内部数组之后添加它。
}
console.log(JSON.stringify(arr));//因为console.log让我们看到比警报更多的细节。
警报(“最后:+arr”);
尝试以下操作:

var arr = [], // the array to hold the answer
    arr2, // another variable for inner array, note reset in loop below
    j, // declaring this outside of loop for better style
    k;

for (j=0; j < 3; j++){
    arr2 = []; // clear inner array each time
    for (k=0; k < 3; k++){
        arr2[k] = (j + 1) * (k + 1); // build inner array
    }
    arr[j] = arr2; // add the inner array after building it.
}

console.log(JSON.stringify(arr)); // because console.log lets us see more detail than alert.

alert("Finally: " + arr);
var arr=[],//保存答案的数组
arr2,//内部数组的另一个变量,注意下面循环中的reset
j、 //在循环外声明此项以获得更好的样式
K
对于(j=0;j<3;j++){
arr2=[];//每次清除内部数组
对于(k=0;k<3;k++){
arr2[k]=(j+1)*(k+1);//构建内部数组
}
arr[j]=arr2;//在构建内部数组之后添加它。
}
console.log(JSON.stringify(arr));//因为console.log让我们看到比警报更多的细节。
警报(“最后:+arr”);
尝试以下操作:

var arr = [], // the array to hold the answer
    arr2, // another variable for inner array, note reset in loop below
    j, // declaring this outside of loop for better style
    k;

for (j=0; j < 3; j++){
    arr2 = []; // clear inner array each time
    for (k=0; k < 3; k++){
        arr2[k] = (j + 1) * (k + 1); // build inner array
    }
    arr[j] = arr2; // add the inner array after building it.
}

console.log(JSON.stringify(arr)); // because console.log lets us see more detail than alert.

alert("Finally: " + arr);
var arr=[],//保存答案的数组
arr2,//内部数组的另一个变量,注意下面循环中的reset
j、 //在循环外声明此项以获得更好的样式
K
对于(j=0;j<3;j++){
arr2=[];//每次清除内部数组
对于(k=0;k<3;k++){
arr2[k]=(j+1)*(k+1);//构建内部数组
}
arr[j]=arr2;//在构建内部数组之后添加它。
}
console.log(JSON.stringify(arr));//因为console.log让我们看到比警报更多的细节。
警报(“最后:+arr”);

您已声明
arr2
在您的
之外,用于使用此行执行
循环:

var arr2 = [];
这意味着每次运行此代码时:

for (var k = 0; k < 3; k++) {
  arr2[k] = (k + 1) * (j + 1);
}

…正在存储对
arr2
的一个实例的引用,而不是它的副本。因此,每当您更改
arr2
,在
arr
中对它的每个引用也会更改。

您已在
外部声明
arr2
for
循环,使用此行:

var arr2 = [];
这意味着每次运行此代码时:

for (var k = 0; k < 3; k++) {
  arr2[k] = (k + 1) * (j + 1);
}

…正在存储对
arr2
的一个实例的引用,而不是它的副本。因此,每当您更改
arr2
,在
arr
中对它的每个引用也会更改。

您已在
外部声明
arr2
for
循环,使用此行:

var arr2 = [];
这意味着每次运行此代码时:

for (var k = 0; k < 3; k++) {
  arr2[k] = (k + 1) * (j + 1);
}

…正在存储对
arr2
的一个实例的引用,而不是它的副本。因此,每当您更改
arr2
,在
arr
中对它的每个引用也会更改。

您已在
外部声明
arr2
for
循环,使用此行:

var arr2 = [];
这意味着每次运行此代码时:

for (var k = 0; k < 3; k++) {
  arr2[k] = (k + 1) * (j + 1);
}


…正在存储对
arr2
的一个实例的引用,而不是它的副本。因此,每当您更改
arr2
,在
arr
中对它的每个引用也会更改。

这不会产生您正在描述的输出。您的代码生成:
最终:0,2,4,0,2,4
。此外,您面临的问题是:事实上,您正在使用存储在
arr2
中的同一个数组实例,并多次修改它并将其分配给变量。实际上,您需要的是在
j
循环的每个迭代中创建一个新数组。啊,是的,谢谢,我已经修复了它。对这个问题有什么想法吗?是的,请参阅上面的注释。您想要什么在
j
循环的开头有一个语句,说
arr2=[]
。是的,我知道这个解决方案,但数组不应该全部更新并作为新数组使用吗?它会更改以前的值,我不知道如何更改。这不会生成您描述的输出。您的代码生成:
最后:0,2,4,0,2,4,0,2,4
。此外,您面临的问题源于