.push()覆盖Javascript中的数组值

.push()覆盖Javascript中的数组值,javascript,arrays,push,Javascript,Arrays,Push,我检查了“类似的问题”,但我要么不理解答案,要么它们似乎与这个问题无关 在某些情况下,我在尝试时似乎无法覆盖数组值(Loop3),而在其他情况下,数组值在我认为不应该覆盖时被覆盖(Loop4)。我刚刚编辑了代码,以便在各个点显示更多的值 <script> function manual() { myArray = []; td=[1,2,3]; myArray.push(td); td=[4,5,6]; myArray.push(td);

我检查了“类似的问题”,但我要么不理解答案,要么它们似乎与这个问题无关

在某些情况下,我在尝试时似乎无法覆盖数组值(Loop3),而在其他情况下,数组值在我认为不应该覆盖时被覆盖(Loop4)。我刚刚编辑了代码,以便在各个点显示更多的值

<script>
function manual() {
    myArray = [];
    td=[1,2,3];
    myArray.push(td);
    td=[4,5,6];
    myArray.push(td);
    alert(myArray[0]); // Properly reports [1,2,3]
}

function loop() {
    myArray = [];
    td = [];
    for (i=0; i<=1; i++) {
        if (i==0) td=[1,2,3];
        else if (i==1) td=[4,5,6];
        myArray.push(td);
    }
    alert(myArray[0]); // Properly reports [1,2,3]
}

function loop2() {
    myArray = [];
    td = [];
    for (i=0; i<=1; i++) {
        td[i] = 9;
    }
    td = [1,2,3]; // Attempt to overwrite existing values
    myArray.push(td);
    alert(myArray[0]); // Properly returns 1,2,3
}

function loop3() {
    myArray = [];
    td = [];
    for (i=0; i<=1; i++) {
        for (j=0; j<=2; j++) {
            td[j] = 9;
        }
        if (i==0) td=[1,2,3];
        else if (i==1) td=[4,5,6];
        myArray.push(td);
    }
    alert(myArray[0]); // Returns 9,9,9 when I expect 1,2,3
}

function loop4() {
    myArray = [];
    td = [];
    tb = document.getElementById('myTable');
    for (i=0; row = tb.rows[i]; i++) {
        for (j = 0; col = row.cells[j]; j++) {
            td[j] = col.innerHTML;
        }
        alert("td="+td); // Properly get 1,2,3 the 1st time, 4,5,6 the 2nd time
        myArray.push(td);
        alert(myArray); // Expect 1,2,3 the 1st run, and that's what I get
                   // Expect 1,2,3 | 4,5,6 the 2nd run, but get 4,5,6 | 4,5,6
    }
}

</script>

<table id=myTable>
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td><td>6</td></tr>
</table>

<button onclick=manual()>Manual</button>
<button onclick=loop()>Loop</button>
<button onclick=loop2()>Loop2</button>
<button onclick=loop3()>Loop3</button>
<button onclick=loop4()>Loop4</button>

功能手册(){
myArray=[];
td=[1,2,3];
myArray.push(td);
td=[4,5,6];
myArray.push(td);
警报(myArray[0]);//正确报告[1,2,3]
}
函数循环(){
myArray=[];
td=[];

对于函数4中的(i=0;i,您重写了数组元素。因为在第二个for u中输入两次。首先,您的数组填充1,2,3,然后第二个填充4,5,6,最终结果是4,5,6

如果需要1,2,3,可以检查数组是否为空

函数loop4(){
myArray=[];
td=[];
tb=document.getElementById('myTable');
for(i=0;row=tb.rows[i];i++){
对于(j=0;col=row.cells[j];j++){
td[j]=td[j]?td[j]:col.innerHTML;
}
myArray.push(td);
}
log(myArray[0]);//预期为1,2,3,实际为4,5,6
}

123
456
手册
环
回路2
回路3

Loop4
您应该初始化循环索引,如下所示:
for(var i=0;i这不是数组的内置方法
push()
的问题,问题是您正在变异
td
数组。让我们以
loop3
为例:

  • i=0
    迭代结束时,
    td
    [1,2,3]
    ,而
    myArray
    [[1,2,3]]
    ——它存储绑定到
    td
    的数组引用
  • i=1
    迭代开始时,在
    j
    循环(在该循环中,您对先前的数组引用进行了变异,该数组引用由
    td
    绑定)之后,
    td
    [9,9,9]
    ,而
    myArray
    (保存该数组引用)也将受到影响,导致
    [[9,9]
函数mutatedLoop3(){
myArray=[]
td=[]

对于(i=0;i我算出了。下面是答案

//将数组或数组元素推送到另一个数组时,
//不将*数据*复制到新数组;
//将*引用*复制到原始数组或数组元素。
//如果更改原始数组的元素,
//您推送的元素也会更改。
main=[];
sub=[1,2,3];
main.push(sub);//main现在包含1,2,3作为sub的*引用*
sub[0]=9;
警报(主);//包含9,2,3
//------------------------------------------------------------------------------------
//重新定义原始数组会破坏链接/引用。
//------------------------------------------------------------------------------------
main=[];
sub=[1,2,3];
main.push(sub);//main现在包含1,2,3作为sub的*引用*
sub=[];//sub已被重新定义,正在破坏链接。
sub[0]=9;
警报(主);//包含1,2,3
//------------------------------------------------------------------------------------
//设置整个数组的值会重新定义它,从而破坏链接。
//------------------------------------------------------------------------------------
main=[];//重新定义数组,销毁链接
main=[4,5,6];//提供初始值也会重新定义数组
//(销毁链接)。
//------------------------------------------------------------------------------------
//更改元素的值*不是*数组的重新定义,
//因此,联系依然存在。
//------------------------------------------------------------------------------------
main=[];
sub=[1,2,3];
main.push(sub);//main现在包含1,2,3作为sub的*引用*
sub[0]=9;//不重新定义main,只更改其一个元素。ref保持不变。

警报(主);//包含9,2,3
谢谢,但这对我来说毫无意义。我正在推一个数组,它应该会创建一个新行,为什么第一行会被覆盖?我也不理解代码的目的,以及为什么它是必需的。最后,我仍然有我认为与loop3有关的问题。谢谢,但我不理解您的exp的任何部分lanation.我知道移动td=[]是一种修复方法,但我不明白为什么。当你给一个变量分配一个数组时,你实际上是在分配它的引用,即
[1,2,3]
,当你把它推到
myArray
时,你也会把这个引用放到它上面,比如说
myArray[0]
。比如说
myArray[0]
td
i=1
迭代开始时持有数组
[1,2,3]
的引用。因此,当您将
td[j]
分配给9时,您也会更新
myArray[0][j]
的值,这就是为什么在
j
循环之后,
td
myArray[0]
都是
[9,9]
。将
td=[]
移动到迭代开始时意味着您“摆脱”了对
myArray[0]
的引用,这样它的值就不会受到影响