如何在javascript数组元素中显示正确的值?

时间:2017-05-16 21:13:47

标签: javascript arrays object

在下面的代码中,我创建了一个car对象并通过增加计数来修改元素。每次我修改汽车时,我都会把它推到一个名为yada的阵列上。最后,我访问第三辆车进入yada阵列以查看计数是多少,但它报告的计数为6而不是我预期的计数为3。

<html>
<body>
<script>

var car = {limit:4, count:0, trigger:0};
var yada = new Array();

for(var i=0; i<6; i++)
{
    car.count += 1;
    if(car.count >= car.limit)
    {
        car.trigger = 1;

    }
    yada.push(car);
    alert(car.count+" "+car.limit+" "+car.trigger);
};

alert(yada[2].count + " TEST ");

</script>
</body>
</html>

3 个答案:

答案 0 :(得分:4)

了解传递值与传递参考值之间的区别非常重要:Is JavaScript a pass-by-reference or pass-by-value language?

Javascript的默认值始终是按值传递,但对于对象,变量的值是引用。因此,当您传递一个对象并更改其成员时,这些更改将在该函数之外保留。

您可以通过在for循环中创建一个新的汽车对象进行调整:

<html>
<body>
<script>


var yada = new Array();

for(var i=0; i<6; i++)
{
    let car = {limit:4, count:0, trigger:0};
    car.count = i+1;
    if(car.count >= car.limit)
    {
        car.trigger = 1;

    }
    yada.push(car);
    alert(car.count+" "+car.limit+" "+car.trigger);
};

alert(yada[2].count + " TEST ");

</script>
</body>
</html>

因为你声明汽车是一个局部变量,它不会在循环外持续存在,你可以在每个循环中创建一个新的循环,然后你可以存储在你的数组中。

这对我有用。

答案 1 :(得分:1)

每次只有一个car对象可以推送到数组中,因此yada中的所有6个条目都指向同一个汽车对象,其中任何一个的变化都反映在所有&#34;指针&#34;或数组条目。

循环并递增car.count 6次,完成循环后,您可以访问数组中count的{​​{1}},car指向相同的car现在car.count等于6的对象,你看到的是什么。无论您访问哪个数组索引,都会得到相同的结果。

也许,您想要创建多个car个对象,请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

你的构造函数看起来像这样:

function Car() {
    this.limit = 4;
    this.count = 0;
    this.trigger = 0;
}

然后,要创建一个新的car对象,您只需说:

var myCar = new Car();

答案 2 :(得分:0)

在您的数组中只有一个car具有多个引用。您需要从当前car创建一个新对象。

&#13;
&#13;
var car = {limit:4, count:0, trigger:0};
var yada = new Array();

for(var i=0; i<6; i++)
{
    car.count += 1;
    if(car.count >= car.limit)
    {
        car.trigger = 1;
    }
    yada.push(Object.assign({},car) );
};
console.log(yada);
&#13;
&#13;
&#13;