javascript - 通过引用传递?

标签 javascript arrays oop sorting pass-by-reference

谁能告诉我为什么所有 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>

最佳答案

Somehow after the for loop the values of the object.num = 1 no matter what, even though they are never set to 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;
}

关于javascript - 通过引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26944233/

相关文章:

java - 如何初始化数组的元素(1 到 10),然后在打印元素的方法中使用该构造函数?

php - 将数组转换为对象以自动化 array_key_exists()

javascript - 在 Dojo/Dijit 中动态加载 CSS?

javascript - jQuery 动画无法在左侧位置工作

javascript - 如何创建自定义模式弹出窗口 - 以及如何在其外部单击关闭它

php - 如何在MySQL中获取特定值和多个值的总和

javascript - 当网页未最小化或打开新选项卡时,在 JavaScript 超时之前清除计时器

javascript - LoDash - 如何通过公用 key 将一个集合值推送到另一个集合中

c++ - C++ 对象如何保存有关其成员函数的信息

java - 如何解决以下设计问题?