我将1-50之间的随机值分配给对象元素,我有5个对象,我不知道为什么但所有对象都得到相同的随机值...
这是我的代码:
var SmileyRed = {
radius: 15,
xspeed: 0,
yspeed: 0,
xpos:350, // x-position of smiley
ypos: 65 // y-position of smiley
};
var SmileyReds = new Array();
for (var i=0; i<5; i++){
SmileyReds[i] = SmileyRed;
SmileyReds[i].xspeed = Math.floor((Math.random()*50)+1);
SmileyReds[i].yspeed = Math.floor((Math.random()*50)+1);
}
SmileyReds [0] .xspeed和SmileyReds [3] .xspeed具有相同的值,但它们不应该不同吗?
答案 0 :(得分:3)
问题是从0到4的索引包含对同一对象SmileyRed
的引用。如果要分隔它们,则应为每次迭代创建一个新对象。
因此,您实际上是在每次迭代中更改相同的对象。因此,您将始终使用最后一个随机数(来自最后一个对象)。
通过调用返回对象的函数,您将获得每次迭代的新对象。如下所示。
var SmileyRed = function() {
return {
radius: 15,
xspeed: 0,
yspeed: 0,
xpos:350, // x-position of smiley
ypos: 65 // y-position of smiley
}
};
var SmileyReds = new Array();
for (var i=0; i<5; i++){
SmileyReds[i] = SmileyRed();
SmileyReds[i].xspeed = Math.floor((Math.random()*50)+1);
SmileyReds[i].yspeed = Math.floor((Math.random()*50)+1);
}
<强> JSfiddle 强>
答案 1 :(得分:3)
问题在于,当你使一个对象等于另一个对象时,新对象是对原始对象的引用,而不是副本。
正在发生的事情是你正在为原始的SmileyRed创建5个参考。基本上当你改变一个,你改变所有。因此,只有在循环中应用的值是从循环的最后一次传递开始,前4次传递才会被覆盖。
您可以更改为:
var SmileyReds = new Array();
for (var i=0; i<5; i++){
/* new object each pass*/
SmileyReds[i] = {
radius: 15,
xspeed: 0,
yspeed: 0,
xpos:350, // x-position of smiley
ypos: 65 // y-position of smiley
};
SmileyReds[i].xspeed = Math.floor((Math.random()*50)+1);
SmileyReds[i].yspeed = Math.floor((Math.random()*50)+1);
}
另一种方式是:
var SmileyRed = function(){
return{
radius: 15,
xspeed: 0,
yspeed: 0,
xpos:350, // x-position of smiley
ypos: 65 // y-position of smiley
};
}
for (var i=0; i<5; i++){
/* new object each pass*/
SmileyReds[i] = SmileyRed();/* note () this time*/