JavaScript对象文字和阵列

问题描述:

我有以下的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 

我在做什么错?

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

试试这个:

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

您正在使用与您的对象相同的参考。您需要每次创建一个新的。

例如

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我们正在重新申报创建一个新的实例。

+3

AFAIK你不能在JS“重新申报”变量,则`var`部分将只是被忽略,这个答案会在没有额外的`var`s的情况下工作(即只有o = {})。 – cic 2009-07-09 09:30:46

+2

cic是正确的,你不是每次都声明一个新的变量,而是你在任何地方都使用相同的变量o,但是给它赋值新的值。 – 2009-07-09 09:58:46

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

您将要覆盖在oCord x和y的值。

所以,当你说

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

覆盖旧的值。

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]