JavaScript 2维数组

时间:2013-05-13 15:08:54

标签: javascript arrays

我有以下

    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 个答案:

答案 0 :(得分:3)

该行

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

创建单个共享数组对象。二维数组中的每个“内部”数组实际上只是对同一个对象的引用,因此更改一个“内部”数组必然会以完全相同的方式影响另一个。

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

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

Futhermore ,即使您实施了此更改,该行:

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

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

答案 1 :(得分:3)

arrayT['one']arrayT['two']是相同的数组,您对其中的任何更改都会影响另一个。

要解决此问题,请创建单独的数组:

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

当您使用arrayT['one'] = arrayT['two'] = new Array()时会发生同一阵列的多次引用问题,但arrayT['two'] = arrayT['one']会产生同样的问题。要使arrayT['two']成为arrayT['one']的副本,您应该使用以下内容:

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

答案 2 :(得分:0)

虽然apsillers对他的答案是正确的,但更准确的替代是简单地写arrayT['two'] = arrayT['one'].slice(0) 将作业遗漏到第2行的arrayT['two']。 请注意,这只是一个浅表副本。如果您决定稍后使用可变对象,则可能需要根据您的需要进行深层复制。