Javascript:将数组推入数组与将值推入数组?

Ale*_*ues 3 javascript arrays

我是 javascript 新手,不太了解 push() 方法的工作原理。

我有两个空数组,row 和 newData。以及输出非常不同的两段代码:

for (i = 1; i <= 10 ; i++) {
    row[0] = i;
    newData.push(row);
}
Run Code Online (Sandbox Code Playgroud)

导致 newData == [10,10,10,...,10],我觉得这非常令人惊讶,并且

for (i = 1; i <= 10 ; i++) {
    newData.push(i);
}
Run Code Online (Sandbox Code Playgroud)

结果 newData == [1,2,3,...,8,9,10] 这是预期的结果。

但我不明白为什么当第二个循环按预期工作时,第一个循环的每次迭代似乎都用最后一个元素替换 newData 的每个元素?

谢谢!

Lui*_*gro 6

你的第一个片段:

var row = new Array();
var newData = new Array();

for (i = 1; i <= 10 ; i++) {
    row[0] = i;
    newData.push(row);
}
Run Code Online (Sandbox Code Playgroud)

推送 10 次对数组的引用,同时将该数组row的位置 0 中包含的值依次更改为值 1, 2, 3 .. 10,最终结果是设置数组的最终内容row数组到:[10]

的实际最终值newData更正确地显示为:

[[10],[10],[10],[10],[10],[10],[10],[10],[10],[10]]
Run Code Online (Sandbox Code Playgroud)

而不是:

 [10,10,10,...,10]
Run Code Online (Sandbox Code Playgroud)

在 JavaScript 中,将对象推入数组(在本例中为 Array 类的实例)实际上是将对象的引用推入数组。推送相同的变量row不会创建它的多个实例。

此处详细解释了此行为:JavaScript Is a pass-by-reference or pass-by-value language? .