JavaScript对象文字和数组
我有以下JavaScript代码:JavaScript对象文字和数组,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); 现在,这将创建以下结构(由三个对象组成的数组) 然
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);
现在,这将创建以下结构(由三个对象组成的数组)
然而,当我尝试访问每个对象的属性时,它们的结果都是一样的。为什么会这样
alert(aStack[0].x); // Outputs 716
alert(aStack[1].x); // Outputs 716
alert(aStack[2].x); // Outputs 716
我做错了什么?您对对象使用了相同的引用。每次都需要创建一个新的 例如 或者,如果您更喜欢您的写作风格,请执行以下操作:
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
重新声明,以创建一个新实例。您对所有坐标对象使用相同的OCORD
请尝试以下方法:
var aStack = [];
aStack.push( { x: 726, y: 52} );
aStack.push( { x: 532, y: 76} );
aStack.push( { x: 716, y: 529} );
您正在覆盖oCord中x和y的值 所以当你说
oCoord.x = 716;
oCoord.y = 529;
它会覆盖上一个值。可能更好,但作为替代解决方案,您可以:
// 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]
谢谢,太好了。第一个完整正确的解释给出了正确的答案如果你不能在JS中“重新声明”变量,
var
部分将被忽略,这个答案将在没有额外的var
s的情况下工作(即仅o={})。cic是正确的,你不是每次都声明一个新变量,而是到处使用相同的变量o,但赋予它新的价值。
var aStack = [];
aStack.push({ x: 726; y: 52 });
aStack.push({ x: 76; y: 532 });
aStack.push({ x: 716; y: 529 });
oCoord.x = 716;
oCoord.y = 529;
// 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]