祝你好运:)
为什么当我编辑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());