美好的一天:)
为什么当我编辑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[]
会被编辑
答案 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());