チマチマと 詳説 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 の場合は内部的には同じメモリ領域を指すことになるわけだけど。本読んだ限りじゃどうなるかわからんかったー。