ギリギリ行けるお一人様のライン

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 + ']');

A 回答 (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
のように。

参考URL:http://okwave.jp/qa2440094.html
    • good
    • 0

<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そっくりなんだよなあ。。。
参照渡しにするには、クラスを作ってあげればよろし。
    • good
    • 0

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];
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報