2013-01-09 46 views
0

好日子:)AS3操作

为什么,当我编辑的hold:Array,则array:Array也得到editted?

举个例子:

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!* 
} 

步步分析

阵列[]看起来像这样(举例来说):

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

对不起,我有一些错误,请重新阅读! – Wulf

+0

这是一个例子,但我会改变它。 – Wulf

回答

1

是的,数组作为参考存储在变量中。这意味着,当您创建阵列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()); 
+0

[(...)在浅拷贝中,如果原始数组的元素是对象,则只复制对象的引用而不是对象本身。副本指向与原始相同的对象。对这些对象所做的任何更改都反映在这两个数组中。](http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html) – inhan

+1

@inhan这是正确的,我不确定是什么你想说?在OP的情况下,这也不是一个问题,因为所有的值都是将被克隆的基元(数字,布尔值或字符串)。 – Marty

+1

只是想让OP明确(以及其他寻找类似解决方案的人),在某些情况下使用此方法将无法按预期工作。所以这只是对你的帖子的一个重要补充,没有别的。 – inhan