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
我们正在重新申报创建一个新的实例。
答
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]
AFAIK你不能在JS“重新申报”变量,则`var`部分将只是被忽略,这个答案会在没有额外的`var`s的情况下工作(即只有o = {})。 – cic 2009-07-09 09:30:46
cic是正确的,你不是每次都声明一个新的变量,而是你在任何地方都使用相同的变量o,但是给它赋值新的值。 – 2009-07-09 09:58:46