• ベストアンサー

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

  • bazax
  • お礼率5% (12/228)

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

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

その他の回答 (2)

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.3

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

noname#39970
noname#39970
回答No.2

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];

関連するQ&A

  • javascript 値渡し?参照?

    javascriptの値渡しについて勉強中なのですが、質問です。 ----------------------------------------------------------------- function aaa(a,b){ var ttt = a ; a = b ; b = ttt ; } var a1 = 1 ; var a2 = 2 ; aaa (a1,a2) ; document.write(a1 ,a2); ------------------------------------------------------------------- 上記のようなコードで引数の値が交換できると思うのですが、正しくは出来ないようです。 1,0と出力されてしまいます。 どうしてなのでしょうか。 お聞きしたいのは、 ・この引数は値渡しなのか、参照なのか。 ・どうして出来ないのか詳しい理由。 よろしくお願いします。

  • 【javascript 文法】値渡し?参照渡し?

    以下実行すると、AAAをクリックしてもBBBをクリックしても「BBB」とアラートされます。 <html> <head> <script type="text/javascript" src="prototype.js"></script> </head> <body> <script type="text/javascript"><!-- var gDown= false; var div = document.createElement('div'); div.id = 'AAA'; div.innerHTML = 'AAA'; document.body.appendChild(div); Event.observe(div, 'mousedown',function(){ gDown = div; }); var div = document.createElement('div'); div.id = 'BBB'; div.innerHTML = 'BBB'; document.body.appendChild(div); Event.observe(div, 'mousedown',function(){ gDown = div; }); Event.observe(document, 'mouseup',function(){ alert(gDown.id); gDown=false; }); //--></script> </body> </html> javascriptって値渡しだと思っていたので、期待した動作と異なります。参照渡しだと考えると納得できるのですが、javascriptって 参照渡し?それとも値渡し? と混乱しています。 この辺のところを、教えてください。お願いいたします。

  • 配列に格納した値が保存されない

    DB(Access)から取得した内容を配列に格納し、その内容を取り出すプログラムを 以下のように書いてみました。 whileループ内の alert("ループの中=" + data_array[i]); では配列の中の値が参照できるのですが whileループの外で for(var i=0;i < data_array.length; i++){ alert("ループの外:" + data_array[i]); } 配列の中身を表示させようとしたところdata_array.length の長さが0になっており 配列の中身が参照できない状態です。なにが原因かわかりますでしょうか。 <html> <script language="javascript" type="text/javascript"> function dbSearch() { var sql="select * from URL where flg=0"; var database = dbConnect(); var recordSet = database.Execute(sql); var data_array = new Array(); while (!recordSet.EOF){ data_array[i] = recordSet(0); alert("ループの中=" + data_array[i]); recordSet.MoveNext(); } alert("長さ=" + data_array.length); for(var i=0;i < data_array.length; i++){ alert("ループの外:" + data_array[i]); } database.Close(); return; } //データベースに接続 function dbConnect() { var database = new ActiveXObject("ADODB.Connection"); database.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\\test.mdb;"); return database; } </script> <body> <input type="button" value="DB接続" onclick="dbSearch()"> </body> </html>

  • javascript引数

    文字列(a)を入れると、ある文字を返してくれるロジックを作成したのですが 1.jsの中身。 ************************************** function test(a){var i 省略 a.charAt(i);}return s;} ************************************** http <script type="text/javascript" src="1.js"></script> ~ ここで、引数のaに値を渡して、返してもらうのは、 この後、どのようにコーディングすれば宜しいですか。 すみませんが宜しくお願いします。

  • JavaScriptで関数設定時に引数を指定したい

    状況を説明します ・複数のthにoncklickイベントで同じ関数を呼びたい ・th要素のタグにonclick属性を書くのは同じ記述をたくさん書くことになるのでやりたくない ・JavaScriptでonclick属性に関数を設定したい ・th要素自身を引数としたい ※WindowsXPのIE8で動けばOKです。 (0)ベタ書きするとこんな感じになります。これなら動くことを確認しています。 # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # # function func1(th) { #   … # } (1)引数がなければこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = func1; # } (2)無名関数ならこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = function() { #     … #   } # } しかしこの2つの書き方「(1)(2)」とも、引数を入れようとしたところ どうすればいいかわかりませんでした。 上記の状況を踏まえ… 質問は以下です ・(1)のような書き方で、引数アリの関数を設定する方法 ・(2)のような書き方で、引数アリの関数を無名関数で設定する方法 ・それ以外の代替方法 これを教えてください。 そもそもJavaScriptではできないのであればその旨を教えてください。 よろしくお願いします。

  • JavaScriptで取得した値について

    初めまして、Etizenと言います。 早速質問なのですが、JavaScriptで 例えば、 <SCRIPT LANGUAGE="JavaScript"> <!--  var QS = new Array;  if (location.search.length > 1)  {   var m_Array =    location.search.substr(1).split("&");    for (idx in m_Array)    { QS.push(m_Array[idx].split("="));    }  } //--> </SCRIPT> という、配列でデータを取得した場合にこれを、HTMLの <input type="text" name="STFCD" Value> のValueの中に仕込むことは可能でしょうか? よろしくお願い致します

  • Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。

    Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。 var data = [ [1,2,3], [4,5,6], [7,8,9] ]; for (var i = 0; i < data.length; i++){ for (var j = 0; j < data[i].length; j++){ <--- ここで lengthのオブジェクトがNullというエラーになります。 alert(data[i][j]); } } よろしくお願いいたします。

  • 何が悪いのでしょうか。

    <html> <head> <title>たいとる</title> <script> baguru = new Array(); window.onload=function(){ var tags=document.getElementsByTagName("*"); for(var i=0;i<tags.length;i++){ matti = tags[i].id.match(/^test[0-9]+$/) if(matti){ baguru.push(matti); } } } xx = new Array(),xx[0]="test123",xx.push('test30'),xx.push('test200','test1'),str=xx[1]; yy = new Array("disp1", "disp200", "disp30"),stl=yy[1]; </script> </head> <body> <div id="test123">TEST123</div> <div id="test30">TEST30</div> <span id="test200">TEST200</span> <div id="test1">TEST1</div> <div id="hoka123">HOKA123</div> <hr> アドレスバーでTEST用。 <pre> javascript:alert(xx[1].match(/disp(\d+)$/)[1]); javascript:alert(yy[1].match(/disp(\d+)$/)[1]); javascript:alert(baguru[1]);//中身はある javascript:alert(baguru[1].match(/disp(\d+)$/)[1]);//反応無し </pre> <pre> javascript:alert(xx); javascript:alert(yy); javascript:alert(baguru); </pre> </body> </html> 数字部分だけをアラートで出したいのですが、配列baguruが反応しません。何が悪いのでしょうか

  • JavaScriptで配列を取得したい

    お世話になります。 データベースから取得したリスト(可変)をフォームに設定したところ、 JavaScriptで配列を参照したところ、リストが1件の場合はエラー、 3件の場合は正常という現象がおき、困っております。 リストが1件の場合でも、配列に認識させたいのですが、 他の箇所も記述が多いためシンプルな手法を探しています。 よろしくお願い致します。 3件のレコードの場合、正常に処理される。 ---- HTML内 -------------- <input type="checkbox" name="chk_sel"> <input type="checkbox" name="chk_sel"> <input type="checkbox" name="chk_sel"> ---- JavaScript内 -------------- function test(){ var obj = document.form1.chk_sel; if (obj != null) { for(i=0;i<obj.length;i++){ if(obj[i].checked == true){ check_num++; } } } } ----------------------------- ■1件のレコードの場合、エラーになる (配列に認識されないらしく、obj.lengthが取得できない) ---- HTML内 -------------- <input type="checkbox" name="chk_sel"> ---- JavaScript内 -------------- function test(){ var obj = document.form1.chk_sel; if (obj != null) { for(i=0;i<obj.length;i++){ if(obj[i].checked == true){ check_num++; } } } } -----------------------------

  • prototype.jsを使うとfor~inがバグる件

    下記について知っている人が居ましたら教えてください。 HTAでprototype.jsを使うとfor~inでバグります。 具体的に, prototype.jsを読み込んだ状態でfor~inして, for~inの情報を参照すると,値ではなくソースコードが表示されます。 prototype.jsを読み込ませない場合で,通常のようにfor~inして, for~inの情報を参照すると,問題なく値が参照できます。 OS環境とバージョンによって違うかもしれませんが,僕の環境では現象が発生します。 対策方法を知っている人がいましたら教えてください。 下記のソースを実行すると, バグらない場合は,次のように出力されます。 hoge piyo toge バグる場合は,次のように出力されます。 function(item, i) { i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; var n = this.slice(0, i).reverse().indexOf(item); return (n < 0) ? n : i - n - 1; } -略- { this._each(function(value) { iterator(value, index++); }); } catch (e) { if (e != $break) throw e; } return this; } hoge piyo toge prototype.js使用すると... ///////////////////////////////////// // sample.hta バグ <html> <head> <title>ツール</title> <script type="text/javascript" src="./prototype.js"></script> </head> <body onLoad="javascript:window.resizeTo(600,480)"> <script language="javascript"> {   // Iniイメージ   // [TEST]   // KEY1=hoge   // KEY2=piyo   // KEY3=toge   var section = "TEST";   var key = new Array("KYE1", "KYE2", "KYE3");   var data = new Array("hoge", "piyo", "toge");   // セクション   items = new Array();   items[ section ] = new Array();   // キー   for(var i=0;i<key.length;i++){     items[ section ][ key[i] ] = data[i];   }   // 参照   for(var j in items[ section ]){     document.write( items[ section ][ j ] + "<br />\n" );   }   delete key;   delete data;   delete items; } </script> </body> </html> prototype.js使用しないと... ///////////////////////////////////// // sample.hta バグらない <html> <head> <title>ツール</title> <!-- <script type="text/javascript" src="./prototype.js"></script> --> </head> <body onLoad="javascript:window.resizeTo(600,480)"> <script language="javascript"> {   // Iniイメージ   // [TEST]   // KEY1=hoge   // KEY2=piyo   // KEY3=toge   var section = "TEST";   var key = new Array("KYE1", "KYE2", "KYE3");   var data = new Array("hoge", "piyo", "toge");   // セクション   items = new Array();   items[ section ] = new Array();   // キー   for(var i=0;i<key.length;i++){     items[ section ][ key[i] ] = data[i];   }   // 参照   for(var j in items[ section ]){     document.write( items[ section ][ j ] + "<br />\n" );   }   delete key;   delete data;   delete items; } </script> </body> </html> prototype.jsを最後に読み込ませると... ///////////////////////////////////// // sample.hta バグらない <html> <head> <title>ツール</title> </head> <body onLoad="javascript:window.resizeTo(600,480)"> <script language="javascript"> {   // Iniイメージ   // [TEST]   // KEY1=hoge   // KEY2=piyo   // KEY3=toge   var section = "TEST";   var key = new Array("KYE1", "KYE2", "KYE3");   var data = new Array("hoge", "piyo", "toge");   // セクション   items = new Array();   items[ section ] = new Array();   // キー   for(var i=0;i<key.length;i++){     items[ section ][ key[i] ] = data[i];   }   // 参照   for(var j in items[ section ]){     document.write( items[ section ][ j ] + "<br />\n" );   }   delete key;   delete data;   delete items; } </script> <script type="text/javascript" src="./prototype.js"></script> </body> </html>