JavaScript对象文字和数组

时间:2009-07-09 09:04:44

标签: javascript

我有以下JavaScript代码:

oCoord = {x: null, y: null};
var aStack = [];

oCoord.x = 726;
oCoord.y = 52;
aStack.push(oCoord);

oCoord.x = 76;
oCoord.y = 532;
aStack.push(oCoord);

oCoord.x = 716;
oCoord.y = 529;
aStack.push(oCoord);

现在,这将创建以下结构(三个对象的数组)。

Array[Object, Object, Object];

然而,当我尝试访问每个对象的属性时,它们都是相同的。这是为什么?

alert(aStack[0].x); // Outputs 716
alert(aStack[1].x); // Outputs 716
alert(aStack[2].x); // Outputs 716

我做错了什么?

5 个答案:

答案 0 :(得分:12)

您对所有坐标对象使用相同的oCoord。

请改为尝试:

var aStack = []; 
aStack.push( { x: 726, y: 52} );
aStack.push( { x: 532, y: 76} ); 
aStack.push( { x: 716, y: 529} );

答案 1 :(得分:3)

您对对象使用相同的引用。您需要每次都创建一个新的。

E.g。

var aStack = []; 

aStack.push( { x: 2, y: 23 }); 
aStack.push( { x: 3, y: 4 }); 
aStack.push( { x: 33, y: 2 });

或者,如果您更喜欢自己编写的样式,请执行以下操作:

var aStack = []; 

var o = {};
o.x=1;
o.y=3;
aStack.push(o); 

var o = {};
o.x=21;
o.y=32;
aStack.push(o); 

var o = {};
o.x=14;
o.y=43;
aStack.push(o); 


alert( aStack[0].x ); 
alert( aStack[1].x ); 
alert( aStack[2].x );

请注意,我们每次都会使用var重新声明以创建新实例。

答案 2 :(得分:1)

var aStack = [];
aStack.push({ x: 726; y: 52 });
aStack.push({ x: 76; y: 532 });
aStack.push({ x: 716; y: 529 });

答案 3 :(得分:1)

您正在覆盖oCord中的x和y值。

所以当你说

 oCoord.x = 716;
 oCoord.y = 529;

它会覆盖之前的值。

答案 4 :(得分:1)

Egil Hansen's answer可能更好,但您可以clone the object作为替代解决方案:

// Some function to clone objects (e.g. using jQuery)
function clone(o) { return $.extend(true, {}, o); }

oCoord = { x: null, y: null };
var aStack = []; 

oCoord.x = 726; 
oCoord.y = 52; 
aStack.push( clone(oCoord) ); 

oCoord.x = 76; 
oCoord.y = 532; 
aStack.push( clone(oCoord) ); 

oCoord.x = 716; 
oCoord.y = 529; 
aStack.push( clone(oCoord) );

// console.log(aStack) =>
// [Object x=726 y=52, Object x=76 y=532, Object x=716 y=529]