Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript对象文字和数组_Javascript - Fatal编程技术网

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); 现在,这将创建以下结构(由三个对象组成的数组) 然

我有以下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);
现在,这将创建以下结构(由三个对象组成的数组)

然而,当我尝试访问每个对象的属性时,它们的结果都是一样的。为什么会这样

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]