■トラブルが起こるサンプルソース
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番目のアラート }
■上記の実行結果
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);
■追記
「クローンを作る」という行為になかなか需要がない事が分かりました。まずは、クローンが本当に必要なのかを見直した方が良いかもしれません。
ピンバック: Just One Planet