【问题标题】:Pass by reference?通过引用传递?
【发布时间】:2015-01-12 16:26:36
【问题描述】:

谁能告诉我为什么所有 object.num 的打印都为 1?这让我发疯。不知何故,在 for 循环之后 object.num = 1 无论如何,即使它们从未设置为 1。请复制整个段以进行调试。

<script type="text/javascript">
window.addEventListener("load", main, false);

const n = 4;

function main()
{
    var belt = new Array(4*n);
    initArr(belt);
    printIt(belt);
    populateArr(belt);
    printIt(belt);
    reorder(belt);
    printIt(belt);
}

function populateArr(arr)
{
    var a = {name:"a", num:0};
    var b = {name:"b", num:0};
    var end = arr.length;
    var i = end-1;

    for(var temp = n; temp > 0; temp--)
    {
        a.num = temp;
        arr[i] = a;
        i-=2;
    }

    i = end-2;
    for(var temp = n; temp > 0; temp--)
    {
        b.num = temp;
        arr[i] = b;
        i-=2;
    }

    return arr;
}

function printIt(arr)
{
    var tempArr = new Array(arr.length);
    for(var i=0; i < arr.length; i++)
    {
        tempArr[i] = arr[i].name + arr[i].num;
    }
    console.log(tempArr);
}

function initArr(arr)
{
    var nothing = {name:null, num:0};
    for(var i=0; i<arr.length; i++)
    {
        arr[i] = nothing;
    }
    return arr;
}

function reorder(arr)
{
    var nothing = {name:null, num:0};
    var counter = 0;
    var aIndex = 0;
    var bIndex = null;
    for(var i=0; i < arr.length; i++)
    {
        if(arr[i].name === "b" && bIndex === null)//first b doesn't get moved
        {
            bIndex = i+1;
        }

        else if(arr[i].name === "a")
        {
            arr[aIndex] = arr[i];
            arr[i] = nothing;
            counter++;
            aIndex++;
        }
        else if(arr[i].name ==="b")
        {
            arr[bIndex] = arr[i];
            arr[i] = nothing;
            counter++;
            bIndex++;
        }
    }
    console.log("count: " + counter);
    console.log("n: " + n);
    return arr;
}

</script>

【问题讨论】:

    标签: javascript arrays oop sorting pass-by-reference


    【解决方案1】:

    无论如何,在 for 循环之后 object.num = 1 的值,即使它们从未设置为 1。

    是的,“他们”是 - 在此循环的最后一次迭代中,“他们”被设置为 1:

    for(var temp = n; temp > 0; temp--)
    {
        a.num = temp;
        arr[i] = a;
        i-=2;
    }
    

    该循环的最后一次迭代是在 temp 为 1 时。

    现在,您实际上只有一个对象 - 并且您将数组的每个元素都设置为对该对象的引用。这就是为什么数组中的所有值看起来都一样的原因。如果你想每次都创建一个不同的对象,你应该使用:

    for(var temp = n; temp > 0; temp--)
    {
        arr[i] = { name: "a", num: temp };
        i -= 2;
    }
    

    【讨论】:

    • 谢谢,因为我有同样的问题,我也找到了我的问题的答案,但你的回答真的很棒,再次感谢
    • 非常感谢您的快速回复。我从来没想过只引用了一个对象。
    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 2020-04-01
    • 1970-01-01
    • 2011-06-28
    • 2015-07-22
    • 2015-05-02
    • 2012-03-13
    • 2015-06-04
    相关资源
    最近更新 更多