AS3操纵多维数组

时间:2013-01-09 04:04:01

标签: arrays actionscript-3 flash multidimensional-array

美好的一天:)

为什么当我编辑hold:Array时,array: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[]会被编辑

2 个答案:

答案 0 :(得分:1)

这是因为数组(typeof将赋予Object)通过引用传递。要复制其值,您需要clone an array in ActionScript

Here's an explanation of this适用于ActionScript 2.0(也适用于ActionScript 3.0,但我找不到本文的版本)。

答案 1 :(得分:1)

是的,数组作为引用存储在变量中。这意味着,当您创建数组array然后将其存储在hold中以创建2D数组时,您只需在array内存储对hold的引用。< / p>

例如,您可能希望如果您在一个数组中存储了一个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());