- ベストアンサー
Javascriptで引数の参照渡しか戻り値を複数取得したい
Javascriptで引数を参照渡しを行いたいのですが空で返ってきます。 どうすればよいのでしょうか? 参照渡しの引数がうまくいかない場合は戻り値を2つ返す方法と受け取る記述の仕方など知りたいです。 function test(indat, outdat, retval){ outdat = []; for (var i=0; i<indat.length; i++){ outdat[i] = indat[i]; } retval = 123; } var indat = new Array(); var outdat= new Array(); var retval = ""; indat[0] = 'A'; indat[1] = 'B'; indat[2] = 'C'; test(indat, outdat, retval); for (var i=0; i<outdat.length; i++){ alert(outdat[i]); } alert('retval=[' + retval + ']');
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
JavaScriptは、 基本データ型(number、boolean、string、undefined)は値渡し、 オブジェクト型(Object、Arrayなど)は参照渡しです。 なので、引数をArrayにでもすれば参照渡しができます。 提示コードのoutdatでうまくいっていないのは、 > outdat = []; この行が原因です。 これは > outdat = new Array(); と書いたのと同じことですから、 この行でoutdatの参照先自体が新たなArrayオブジェクトに対するものに書き換わってしまいます。 (なので正確には、参照が値渡しされるといった方がいいかもしれない。) そのため、以降のoutdatへの変更は、 もともと指していた関数外で作成されたArrayへのものではなくなり反映されなくなっています。 > 戻り値を2つ返す方法 ArrayやObjectをreturnする方法があります。 return ['A', 'B']; //Arrayをreturn とか return { 'valA': 'A', 'valB': 'B' }; //Objectをreturn のように。
その他の回答 (2)
- PED02744
- ベストアンサー率40% (157/390)
<script type="text/javascript"> // 属性データ保存用エリア定義 function Datas(){ this.indat = new Array(); this.outdat = new Array(); this.retval = ""; } // テストメソッド function test(indats){ outdat = []; for (var i=0; i<indats.indat.length; i++){ outdat[i] = indats.indat[i]; alert('indat[i]=' + outdat[i]); } retval = 123; alert('retval=[' + retval + ']'); indats.outdat = this.outdat; indats.retval = this.retval; } // メイン(?)処理 DATAS = new Datas(); // ← 属性データ保存用エリアのインスタンス生成 DATAS.indat[0] = 'A'; DATAS.indat[1] = 'B'; DATAS.indat[2] = 'C'; test(DATAS); for (var i=0; i<DATAS.outdat.length; i++){ alert(DATAS.outdat[i]); } alert('retval=[' + DATAS.retval + ']'); </script> ※こんなところはJAVAそっくりなんだよなあ。。。 参照渡しにするには、クラスを作ってあげればよろし。
JavaScriptはCと違って 参照渡しというのが無い でも配列やらをそのまんま渡せる 件のscriptではfunctionでローカル変数としてindat,autdat,retvalを宣言してしまっている(「function test(indat, outdat, retval)」の部分)ので呼び元の値を扱えない ソースをそのまま使いたいなら「function test()」とすべき。 呼び元も「test();」で良い。 返値として return [indat,outdat,retval]; のような事はできるが呼び元でそれを分解しなければならないので手間 r = test(); indat = r[0]; outdat = r[1]; retval = r[2];