2017-05-16 60 views
1

在下面的代码中,我创建了一个汽车对象并通过增加计数来修改一个元素。每次修改汽车时,我都会将它推到一个名为yada的阵列上。最后,我访问被放置到亚达阵列看到计数是什么3车,但它报告什么,而不是我预计的3如何在JavaScript数组元素中显示正确的值?

<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

只有一个'car' –

+0

你推多次引用同一辆车。因此,数组中的所有元素都只是一个元素 - 对汽车物体的引用 –

回答

4

它计数的6计数了解按价值传递和传递参考之间的差异很重要: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> 

因为你声明的车的局部变量,它不会保留在循环外,你创建一个新的每looprun你可以存储在你的数组中。

这适用于我。

+0

变量是函数作用域,您的汽车变量不在for循环中 –

+0

正确,为了正确性,我将其更改为let。尽管如此,代码的作品。 –

1

只有一个car对象每次都插入到数组中,因此yada中的所有6个条目都指向同一个汽车对象,并且其中任何一个对象的更改都反映在所有“指针”或数组条目中。

您遍历并增加car.count 6次,当你用循环中完成访问的carcount的阵列,它指向现已car.count等于6,这就是你所看到的一样car对象英寸无论您访问哪个数组索引,您都会得到相同的结果。

也许,你想创建多个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(); 
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);

相关问题