1

我有以下

    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

4

3 回答 3

3

线

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

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

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

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

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

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

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

于 2013-05-13T15:12:00.407 回答
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();
于 2013-05-13T15:12:14.330 回答
0

虽然 apsillers 的回答是正确的,但更准确的替代方法是简单地在第 2 行arrayT['two'] = arrayT['one'].slice(0) 中将作业省略arrayT['two']。请注意,这只是一个浅拷贝。根据您的需要,如果您决定稍后使用可变对象,您可能需要进行深层复制。

于 2013-05-13T15:21:16.997 回答