29.配列まとめ3
引数として使う時の注意
当然配列を関数やクラスのメソッドへの引数として使うことが多々あります。
この時に、関数内で受けた配列をいじり意図せず元の配列が変わってしまった、なんて経験ありませんか?
え?ええ、私、あるんです(^^;オハズカシイ
例えばこんなの。
var arr:Array=[1,2,3,4,5,6,7];
trace(arr[0]);//1
hoge(arr);
trace(arr[0]);//7
function hoge(_arr:Array):void {
_arr.reverse();//逆にする
}
trace(arr[0]);//1
hoge(arr);
trace(arr[0]);//7
function hoge(_arr:Array):void {
_arr.reverse();//逆にする
}
関数hogeへarrという配列を渡し、その関数内で受けた配列(_arr)の中身を逆にしています。
reverseってのは配列の中身を逆にしてくれるメソッドですよね。
そうすると、あら不思議!もとのarrという配列の中身も逆になっています。
あ、いや、別に不思議でもなんでもないんだけど、うっかりすると意図せず書き換えちゃうこともあるので注意しましょう。
なぜ不思議でないのかは「参照渡し」とかで検索してみるといろいろ勉強することができます。
要は引数に配列を指定した場合、その配列を格納している「住所」を関数に教えてあげてるイメージかな。だから、関数内で受けた配列をいじると元の配列の中身も変わってしまう、ということです。
値渡し
ちなみに値渡しだとこうなります。
var arr:Array=[1,2,3,4,5,6,7];
trace(arr[0]);//1
hoge(arr[0]);
trace(arr[0]);//1
function hoge(n:Number):void {
n++;
trace("n="+n);//n=2
}
trace(arr[0]);//1
hoge(arr[0]);
trace(arr[0]);//1
function hoge(n:Number):void {
n++;
trace("n="+n);//n=2
}
これだと、「住所」ではなく「値」を受けているのでその値(ここではnですね)をいじっても、元のarr[0]の内容は変わりません。