我是javascript的新手,并且不太了解push()方法的工作原理。
我有两个空数组,row和newData。两段代码的输出结果非常不同:
for (i = 1; i <= 10 ; i++) {
row[0] = i;
newData.push(row);
}
结果是newData == [10,10,10,...,10],我觉得非常令人惊讶,
for (i = 1; i <= 10 ; i++) {
newData.push(i);
}
导致newData == [1,2,3,...,8,9,10]这是预期的结果。
但是我不明白为什么第一个循环的每个迭代似乎用最后一个元素替换newData的每个元素,当第二个循环按预期工作时呢?
谢谢!
答案 0 :(得分:3)
您的第一个片段:
var row = new Array();
var newData = new Array();
for (i = 1; i <= 10 ; i++) {
row[0] = i;
newData.push(row);
}
将数组row
的引用推送10次,同时将该数组的位置0中包含的值依次更改为值1,2,3 .. 10将row
数组的最终内容设置为:[10]
。
newData
的实际最终值更准确地显示为:
[[10],[10],[10],[10],[10],[10],[10],[10],[10],[10]]
而不是:
[10,10,10,...,10]
在JavaScript中,将对象推送到数组中(如本例中是Array类的实例),实际上会将对象的引用推送到数组中。推送相同的变量row
不会创建多个实例。
此处详细说明了此行为:Is JavaScript a pass-by-reference or pass-by-value language?。
答案 1 :(得分:0)
第一个代码示例不会返回带有[10,10,10等]的数组,而是一个带有单个项目的数组:[10]。 push方法基本上将每个对象添加到给定数组。如果给定对象是数组,它将不会添加数组的项。它简单地将它像对象一样添加到数组中,并根据现有项确定索引。
向数组添加项目的另一种方法是使用索引。这是两个样本,它们都产生相同的数组。
myString == null;
[0,1,2,3,4]
var arr = [];
for(var i = 0; i < 5; i++) {
arr[i] = i;
}
[0,1,2,3,4]
希望这有帮助
答案 2 :(得分:0)
在第一个示例中,您将阵列row
连续十次推送到newData
。在每次迭代中,您还将值设置为i
。在javascript中,数组是一个对象,当你按下它时,你可以通过引用来实现,而不是通过值(例如你的第二个例子中的文字值的情况)。
因此,最终会得到一个数组newData
,它有十个元素都指向同一个javascript数组,即row
。如果更改行的第一个元素row[0] = 2
,newData也会反映此更改。