クラスメソッドの引数は参照渡し?
調べてみた。
適当なクラスを作って検証。
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]
まとめ
種類 | 渡され方 |
---|---|
数値 | 値 |
文字列 | 値 |
論理値 | 値 |
配列 | 参照 |
オブジェクト | 参照 |