AS3多维数组的操作



祝你好运:)

为什么当我编辑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,因为我们没有编辑它的值!

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

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

这是对ActionScript 2.0的解释(这也适用于ActionScript 3.0,但我找不到这篇文章的版本)

是的,数组作为引用存储在变量上。这意味着当你创建数组array并将其存储在hold中以创建2D数组时,你只是在hold中存储对array的引用。

例如,如果你将一个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());

相关内容

  • 没有找到相关文章

最新更新