代入と参照の落とし穴
javascriptでオブジェクトを作成し、そいつを代入してクローンを作ろうと思ったけれども、どうも挙動がおかしくてなぜだろうと調べてみると、代入元のメンバをいじくると、代入先のメンバも変わるという恐ろしい現象が発生し、私は恐怖におののいたというのは嘘で、そこらへんの挙動について、調べたり実験したりしてみた。
1.undefined
var a; var b=a; a=0; alert(b);
結果:undefined(値渡し)
2.null
var a=null; var b=a; a=0; alert(b);
結果:null(値渡し)
3.数値
var a=0; var b=a; a=1; alert(b);
結果:0(値渡し)
4.文字列
var a="あ"; var b=a; a="い"; alert(b);
結果:あ(値渡し)
5.ブーリアン
var a=true; var b=a; a=false; alert(b?1:0);
結果:1(値渡し)
6.配列
var a=[0,1]; var b=a; a[0]=2; alert(b[0]);
結果:2(参照渡し)
7.オブジェクト
var a={name:'a'} var b=a; a.name='b'; alert(b.name);
結果:b(参照渡し)
8.関数
function a(){return 1;}; var b=a; function a(){return 2;}; alert(b());
結果:2(参照渡し)
うーん、どうやら、Nullや数値、文字列などの、基本型 (Primitive Type)と呼ばれる変数型は値渡しがされ、配列や関数などのオブジェクト型 (Object Type)は参照渡しされるようである。配列やオブジェクトを代入させるには、別の方法を考えるしかないみたいだ。