2013-05-13 91 views
1

我有以下JavaScript的2维数组

var arrayT = new Array(); 
    arrayT['one'] = arrayT['two'] = new Array(); 
    arrayT['one']['a'] = arrayT['one']['b'] = ''; 
    arrayT['two'] = arrayT['one']; 
    arrayT['two']['a'] = 'test'; 
    console.log(arrayT); 

在控制台我

[one][a]='test' 
    [one][b]='' 
    [two][a]='test' 
    [two][b]='' 

为什么?

jsFiddle

回答

3

线

arrayT['one'] = arrayT['two'] = new Array(); 

创建单个共享阵列对象。你的二维数组中的每个“内部”阵列实际上只是对同一个对象的引用,所以改变一个“内部”阵列必然会影响其他在完全相同的方式。

相反,创建两个单独的数组:

arrayT['one'] = new Array(); 
arrayT['two'] = new Array(); 

Futhermore,即使你实现这种变化,该行:

arrayT['two'] = arrayT['one']; 

将产生同样的问题 - arrayT['two']arrayT['one']将指向同一个对象,有可能导致今后性质类似的问题(例如,在NEX改变arrayT['two']['a'] t行将改变arrayT['one']['a'],因为它们指向相同的对象)。

3

arrayT['one']arrayT['two']是相同的阵列,你让一个会影响到其他的任何变化。

为了解决这个问题,创建单独的数组:当您使用arrayT['one'] = arrayT['two'] = new Array()

arrayT['one'] = new Array(); 
arrayT['two'] = new Array(); 

到同一阵列中的多个引用此问题的发生,但arrayT['two'] = arrayT['one']将产生同样的问题。为了使arrayT['two']arrayT['one']副本,你应该使用下列内容:

arrayT['two'] = arrayT['one'].slice(); 
0

虽然apsillers是正确的,他的答案,更准确的更换是简单地写arrayT['two'] = arrayT['one'].slice(0) 离开了分配给arrayT['two']在第2行 请注意,这只是一个浅拷贝。根据您的需要,如果您稍后决定使用可变对象,则可能需要进行深层复制。