繁体   English   中英

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

[英]Javascript: push array into array vs. push values into array?

我是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的每个元素,当第二个循环按预期工作时?

谢谢!

你的第一个片段:

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

for (i = 1; i <= 10 ; i++) {
    row[0] = i;
    newData.push(row);
}

将引用推送10次到数组row ,同时将该数组的位置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不会创建它的多个实例。

这里详细解释了这种行为: JavaScript是一种传递引用还是按值传递的语言?

第一个代码示例不会返回带有[10,10,10等等]的数组,而是一个带有单个项目的数组:[10]。 push方法基本上将每个对象添加到给定数组。 如果给定对象是数组,它将不会添加数组的项。 它简单地将它像对象一样添加到数组中,并根据现有项确定索引。

将项添加到数组的另一种方法是使用索引。 这是两个样本,它们都产生相同的数组。

var arr = [];
for(var i = 0; i < 5; i++) {
    arr[i] = i;
}

[0,1,2,3,4]

var arr = [];
for(var i = 0; i < 5; i++) {
    arr.push(i);
}

[0,1,2,3,4]

希望这可以帮助

在第一个示例中,您将row十次将数组row推送到newData 在每次迭代中,您还将值设置为i 在javascript中,数组是一个对象,当你按下它时,你可以通过引用来实现 ,而不是通过值(在第二个例子中就是文字值的情况)。

因此,最终会发现一个数组newData ,它有十个元素都指向同一个javascript数组,即row 如果更改行的第一个元素, row[0] = 2 ,newData也会反映此更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM