代入された変数を書き換えると代入した変数まで書き換わる件
■トラブルが起こるサンプルソース
<script type="text/javascript">
var x = new Array("1","2","3");
var y;
var a = 10;
var b;
var s = 'test';
var t;
function test(){
y = x;
y.pop();
alert(x);//1番目のアラート
b = a;
b ++;
alert(a);//2番目のアラート
t = s;
t = t.substring(0,2);
alert(s);//3番目のアラート
}
</script>
■上記の実行結果
2番目はそのまま「10」と表示される
3番目もそのまま「test」と表示される
1番目は大方の予想に反して「1,2」と表示される
えっなんで「1,2,3」じゃないの?と普通は思う
■解説
代入「=」とは、そっくりそのままコピーされたと考えるのではなく、常にその値が入っているメモリーの場所情報が渡されたと考えなくてはならない
これは膨大な情報を持った変数の代入などが高速で行えるという言語仕様上のメリットがある
ところがサンプルソースのような違いが現れる。それはtypeofによる分類で
- number
- boolean
- string
- undefined
- null
の型になるものはコピーされ、それ以外はメモリー情報が渡されているからである
■サンプルに加えて下さい
以下のコードをサンプルに加えて実行すると、アラートが3回増え「object、number、string」と表示される
つまりobjectは代入では単純にコピーはされないという事だ
alert(typeof(x));//object alert(typeof(a));//number alert(typeof(s));//string
■じゃぁ配列をコピーするにはどうしたらイイの?
以下のようにすると一応はコピーができる。
var a = new Array("test1","test2","test3");
var b = a.concat ();
var c = a.slice (0);
■追記
1年半経った今、僭越ながら多少なりとも技術力も上がりました。そこで思ったのですが、「クローンを作る」という行為になかなか需要がない事が分かりました。従いまして、個人的にはクローンが欲しくなる設計を見直した方がイイとは思ってます。
TrackBack URL :
Comments (1)