kagamihogeの日記

kagamihogeの日記です。

ActionScript の String はイミュータブルってことを知っとけばよい?

チマチマと 詳説 ActionScript 3.0 を読み進めているわけですが、ちょっと気になる記述がありました。

元の変数の値が String か Boolean、Number、int、uint のインスタンスである代入では、ActionScript はその値のコピーを作って、そのコピーを代入先の変数に代入します。つまり、オリジナルの値そのものとその値のコピーが存在します。

詳説 ActionScript 3.0 p.31 より抜粋(強調部分は俺が入れたもの)

ってことは、Java の String とは挙動が異なる……ってことなのか……?

でもアンマリ意識する必要ないっちゃないんだよね。ActionScript の String は Java と違って == で等価性を調べてくれるんで。

var hoge1:String = "hoge";
var hoge2:String = "hoge";
var hogeCopy:String = hoge1;

trace("hoge1 ==  hoge2" +    (hoge1 == hoge2));      // true と表示
trace("hoge1 === hoge2" +    (hoge1 === hoge2));     // true と表示
trace("hoge1 ==  hogeCopy" + (hoge1 == hogeCopy));   // true と表示
trace("hoge1 === hogeCopy" + (hoge1 === hogeCopy));  // true と表示

=== strict equality 演算子 の結果も true になる。「ストリング式は、文字数が同じで、同じ文字で構成されている場合に、等しいと見なされます。」ってコトなので、その通りの結果になってます。

とかなんとか考えて色々ぐぐっていたら 文字列変数コピーは参照コピーである というエントリが。ふーむ。とりあえずの理解としては AS の String はイミュータブルなオブジェクトになってますよ、ってのを覚えておけばよいようだ。

しかしながらこうした場合どうなるんだろう? (やや非現実的な例だが)

var a = "10万文字分の文字列";
var b = "10万文字分の文字列";//a と同内容の文字列

Java の場合は内部的には同じメモリ領域を指すことになるわけだけど。本読んだ限りじゃどうなるかわからんかったー。