0

良い一日 :)

を編集するhold:Arrayarray: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[]

4

2 に答える 2

1

これは、配列 (typeof は Object を与える) が参照によって渡されるためです。その値をコピーするには、ActionScript で配列を複製する必要があります。

ActionScript 2.0についての説明は次のとおりです (これは ActionScript 3.0 にも当てはまりますが、この記事の後者のバージョンは見つかりませんでした)。

于 2013-01-09T04:16:36.173 に答える
1

はい、配列は参照として変数に対して保存されます。これは、配列を作成しarray、それを に格納しholdて 2D 配列を作成する場合、単に への参照をarray内に格納していることを意味しますhold

たとえば、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());
于 2013-01-09T04:19:06.920 に答える