在下面的代码中,我创建了一个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>
答案 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
创建一个新对象。
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;