0

再会 :)

为什么当我编辑时hold:Arrayarray:Array也会被编辑?

举个例子:

function func(2, 2) { //x, y COORDINATE
   var hold = array[2]; //GET COLUMN OF ARRAY
   hold[2] = 2;         //SET hold[x] to 2
   trace(array[2][2])   //SAME AS hold[x] *but i didn't change array[x]'s value!*
}

逐步分析

array[] 看起来像这样(例如):

1,1,1,1
1,1,1,1
1,1,1,1
1,1,1,1

因此,var hold = array[y]:(其中 y=2)

1,1,1,1

hold[x] = 2(其中 x=2)

1,2,1,1

现在,跟踪array[y][x](其中 y=2,x=2)

1,2,1,1

array[2][2]应该是1,1,1,1,因为我们没有编辑它的值!

问题当我只编辑时 为什么会array[]被编辑hold[]

4

2 回答 2

1

这是因为数组(typeof 将给出 Object)是通过引用传递的。要复制其值,您需要在 ActionScript 中克隆一个数组

这是ActionScript 2.0 的解释(这也适用于 ActionScript 3.0,但我找不到后者的本文版本)。

于 2013-01-09T04:16:36.173 回答
1

是的,数组作为参考存储在变量中。这意味着,当您创建数组array然后将其存储hold以创建 2D 数组时,您只是存储了对arraywithin的引用hold

例如,您会期望如果您将 Sprite 存储在一个数组中,然后编辑该 Sprite 的值,您会从引用该 Sprite 的其他任何地方看到这些更改。这对于数组也是一样的。

var array:Array = [];
var another:Array = [];
var sprite:Sprite = new Sprite();

array.push(sprite);
another.push(sprite);

array[0].x = 10;
trace(another[0].x); // Also 10.

如果您不想要这种行为,您可以使用.slice().concat()对数组进行浅层克隆:

array.push(hold.slice()); // or
array.push(hold.concat());
于 2013-01-09T04:19:06.920 回答