2012-04-12 76 views
0

我有一个复杂的JavaScript对象与数组。当我尝试设置索引的一个属性的值时,它将应用于数组的所有项目。通过索引设置数组对象的值设置所有数组项目

这里是一个基本的例子:

var obj = new Object();  
obj.arr = []; 
obj.arr[0] = {pos:[0,0]}; 
obj.arr[1] = {pos:[0,0]}; 

现在,如果我设置为对象的属性的值,经由特定的索引,

obj.arr[0].pos = [10,10]; 
obj.arr[1].pos = [5,5]; 

这似乎是设定值对于阵列的两个项目,都使用[5,5]。得出的值:

console.log(obj.arr[0].pos)回报[5,5]

console.log(obj.arr[1].pos)也返回[5,5]

我的实际对象要复杂得多,但是这是发生了什么的基本思想......

有任何想法吗?

+0

关于铬的工作正常,您的浏览器是什么? – pylover 2012-04-12 22:56:20

+0

它工作正常。你可以在http://jsfiddle.net/swzF9/看到。 – Zafer 2012-04-12 22:58:12

回答

0

它们共享相同的链接,即一个对象的几个变量/属性引用相同的值。

准确答案(错误在哪里)取决于你的对象是如何组成的。

var nested = {a:1}; 
var obj = {arr:[]}; 
obj.arr[0] = {pos:0, n:nested}; 
obj.arr[1] = {pos:0, n:nested}; 

obj.arr[0].pos = 1; 
obj.arr[1].pos == 1; // false 
obj.arr[0].nested.a = 2; 
obj.arr[1].nested.a == 2; // true 

相同的数组/对象文字的分配是不一样的。

var a = [0]; 
var b = [0]; 
b[0] = 1; 
a[0] == 1; // false 
b = a; 
a[0] = 2; 
b[0] == 2; // true 

a = b = [0]; 
a[0] = 1; 
b[0] == 1; // true 
+0

不确定你的意思..不应该将索引值保持两个对象分开吗?如果他们有不同的索引,他们如何分享相同的链接? – ndmweb 2012-04-12 22:27:08

+0

因为你在分配它们。查看更新的答案。 – kirilloid 2012-04-12 22:29:47

+0

更新了问题并修复了一些错别字。仍然不理解问题。 – ndmweb 2012-04-12 22:36:45