[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

代入と参照の落とし穴

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)は参照渡しされるようである。配列やオブジェクトを代入させるには、別の方法を考えるしかないみたいだ。