2012-04-12 157 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