handlename's blog

コード片など

クラスメソッドの引数は参照渡し?

調べてみた。

適当なクラスを作って検証。

function Test(hoge) {
    this.hoge = hoge;
}

Testクラスのコンストラクタに値を渡してみる。

数値

値渡し(オブジェクト内の値は変化しない)。

var hoge = 4423;
var test = new Test(hoge);

console.log(test.hoge); // => 4423

hoge = 3244;

console.log(test.hoge); // => 4423

文字列

値渡し(オブジェクト内の値は変化しない)。

var hoge = 'hogehoge';
var test = new Test(hoge);

console.log(test.hoge); // => hogehoge

hoge = 'hugahuga';

console.log(test.hoge); // => hogehoge

論理値

値渡し(オブジェクト内の値は変化しない)。

var hoge = true;
var test = new Test(hoge);

console.log(test.hoge); // => true

hoge = false;

console.log(test.hoge); // => true

配列

参照渡し(オブジェクト内の値も変化する)。

var hoge = [1, 2, 3];
var test = new Test(hoge);

console.log(test.hoge); // =>  [1, 2, 3]

hoge[0] = 3;

console.log(test.hoge); // =>  [3, 2, 3]


丸ごと置き換えた場合、オブジェクト内の値には影響しない。

var hoge = [1, 2, 3];
var test = new Test(hoge);

console.log(test.hoge); // =>  [1, 2, 3]

hoge = [3, 2, 1];

console.log(test.hoge); // =>  [1, 2, 3]

オブジェクト

参照渡し(オブジェクト内の値も変化する)。

var hoge = { x: 'xxx', y: 'yyy' };
var test = new Test(hoge);

console.log(test.hoge); // =>  Object { x="xxx",  y="yyy"}

hoge.x = 'zzz';

console.log(test.hoge); // =>  Object { x="zzz",  y="yyy"}


配列と同じく丸ごと置き換えた場合は影響しない。

var hoge = { x: 'xxx', y: 'yyy' };
var test = new Test(hoge);

console.log(test.hoge); // =>  Object { x="xxx",  y="yyy"}

hoge = { z: 'zzz' };

console.log(test.hoge); // =>  Object { x="xxx",  y="yyy"}


ついでに途中で値の種類を変更した場合も調べてみた。

値渡しされるものに参照渡しされるものを入れ直した場合

オブジェクト内の値は変化しない。

var hoge = 1;
var test = new Test(hoge);

console.log(test.hoge);

hoge = [1, 2, 3];

console.log(test.hoge);

参照渡しされるものに値渡しされるものを入れ直した場合

オブジェクト内の値は変化しない。

var hoge = [1, 2, 3];
var test = new Test(hoge);

console.log(test.hoge); // => [1, 2, 3]

hoge = 1;

console.log(test.hoge); // => [1, 2, 3]

まとめ


























種類 渡され方
数値
文字列
論理値
配列 参照
オブジェクト 参照