Javascript:使用for循环将数组推送到数组上

Javascript:使用for循环将数组推送到数组上,javascript,arrays,loops,for-loop,Javascript,Arrays,Loops,For Loop,请给我解释一下。我正在尝试创建一个带有for循环的数组数组。当它不起作用时,我试图简化代码以了解Javascript在做什么,但简单的代码也没有意义 function test(){ var sub_array = []; var super_array =[]; for (var i=1;i<=3;i++){ sub_array.push(i); super_array.push(sub_array); } aler

请给我解释一下。我正在尝试创建一个带有for循环的数组数组。当它不起作用时,我试图简化代码以了解Javascript在做什么,但简单的代码也没有意义

function test(){
    var sub_array = [];
    var super_array =[];
    for (var i=1;i<=3;i++){
        sub_array.push(i);
        super_array.push(sub_array);
    }
    alert(super_array);
}
功能测试(){
var sub_数组=[];
var super_数组=[];
对于(var i=1;i当你推送“sub_数组”时,你没有推送它的副本。你在“super_数组”中得到同一数组三次。(我应该说,你推送同一数组的引用三次。)

您可以这样做:

    // ...
    super_array.push(sub_array.slice(0));

创建副本。

它与您添加到超级数组的子数组相同。因此,它必须不同


您没有创建新数组并将其推入超级数组。

您总是将对同一数组的引用推入超级数组

要解决此问题,可以在推送子阵列之前使用克隆子阵列:

function test() {
    var sub_array = [];
    var super_array = [];
    for (var i = 1; i <= 3; i++) {
        sub_array.push(i);
        super_array.push(sub_array.slice(0));
    }
    alert(super_array);
}

sub\u数组
作为引用存储在
super\u数组
中,这意味着当您更改
sub\u数组
时,更改会反映在
super\u数组

中。请注意,对于for循环中的每次迭代,您都会将相同的数组推入super\u数组。请尝试以下操作:

function test(){
    var sub_array = [];
    var super_array =[];
    for (var i=1;i<=3;i++){
        sub_array = sub_array.slice(0,sub_array.length);
        sub_array.push(i);
        super_array.push(sub_array);
    }
    alert(super_array);
}
功能测试(){
var sub_数组=[];
var super_数组=[];

对于(var i=1;i很好。您必须了解,数组、对象、函数等都是javascript中的引用(只有数字(Int、float等)和字符串是“按值”传递的,这意味着值是复制/复制的)! 如果您有一个
var a=[];
,并说
var b=a
并添加
b.push(“bla”)
,则警报a将向您显示“bla”条目,即使您已将其添加到b。 换句话说,a和b就像妈妈在冰箱上写的一张便条,上面写着“左边的沙子是给你的。”然后你知道,拿左边的那张,而不仅仅是冰箱里的任意三明治。她还可以写另一张便条(变量b)在你家的门上,这样你就知道如果你赶时间去哪里找三明治了。 如果她会在门上贴一个三明治……好吧,那就是阿克沃德。JS也这么认为:)

因此,你的问题的解决方案是休耕

function test(){
    var super_array =[];
    for (var i=1;i<=3;i++){
        var subarray=[];
        for (var u=1;u<=4-i;u++){
            sub_array.push(u);
            super_array.push(subarray);
        }
    }
    alert(super_array);
}
功能测试(){
var super_数组=[];

对于(var i=1;我为什么选择使用
.slice(0)
来复制数组,而不是
.concat()
?这可能更快,但我所做的分析我不确定。有趣的是,根据
concat()
的说法,速度更快。我会在回答中提到它。谢谢你的评论:)此解决方案使我免于头发撕裂。感谢+1使用slice,尽管在使用它克隆整个数组arr.slice()时不需要传入任何参数===arr.slice(0,arr.length)
function test(){
    var super_array =[];
    for (var i=1;i<=3;i++){
        var subarray=[];
        for (var u=1;u<=4-i;u++){
            sub_array.push(u);
            super_array.push(subarray);
        }
    }
    alert(super_array);
}