JavaScript値呼び出しと参照呼出し

このQ&Aのポイント
  • <p>JavaScriptの値呼び出しと参照呼び出しについての質問です。提供されたコードの関数alterArgsの第一引数であるstrは基本データ型(値呼び出し)であり、呼び出された側で変数の内容を変更することができません。基本データ型の引数に変更を加えたい場合は、戻り値として値を返して変数に代入する必要があります。</p>
  • <p>具体的な実行結果は以下の通りです。</p><p>呼び出し前の値:<br>strの値: オリジナルの文字列<br>配列の各要素の値: one, two</p><p>呼び出し後の値:<br>strの値: オリジナルの文字列<br>配列の各要素の値: one, two, three</p>
  • <p>上記の実行結果から分かるように、提供されたコードでは基本データ型の引数を変更しても、呼び出し側で変更が反映されません。変更を反映させるためには、戻り値を利用して呼び出し側で値を更新する必要があります。</p>
回答を見る
  • ベストアンサー

JavaScript値呼び出しと参照呼出し

参考書籍はO'REILLY初めてのJavaScript第2版です <script type="text/javascript"> //<![CDATA[ function alterArgs(strLiteral, aryObject) { //渡された文字列の値を変更 strLiteral = '変更しました'; aryObject.push("three"); } function testParams() { var str = "オリジナルの文字列"; var ary = new Array("one","two"); document.writeln("<h3>呼び出し前の値</h3>"); document.writeln("strの値:" + str + "<br />" ); document.writeln("配列の各要素の値:" + ary + "<br />"); alterArgs(str,ary); document.writeln("<h3>呼び出し後の値</h3>"); document.writeln("strの値:" + str + "<br />"); document.writeln("配列の各要素の値:" + ary + "<br />"); } //]]> </script> /*----------実行結果-----------*/ 呼び出し前の値 strの値:オリジナルの文字列 配列の各要素の値:one,two 呼び出し後の値 strの値:オリジナルの文字列 配列の各要素の値:one,two,three /*----------以下、疑問です。----------*/ alterArgs(str,ary);の第1引数であるstrは「基本データ型(値呼び出し)」であるため 呼び出された側では、呼び出した側で使われていた変数の内容を変更することができません。 以下、基本データ型の引数に変更を加えたい場合は、 その変更後の値を戻り値として戻して変数に代入すれば、 呼び出し側でも変更を反映できるのですよね。 自分なりに幾度、打ち込んでみたものの以下のように 実行結果をかえることができません。 長くなりましたが回答の方、宜しくお願いします!!! /*----------実行結果 ----------*/ 呼び出し前の値 strの値:オリジナルの文字列 配列の各要素の値:one,two 呼び出し後の値 strの値:変更した 配列の各要素の値:one,two,three

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

javascriptでは基本データ型は値呼出しで、オブジェクト型は参照呼出しとかいてませんか? したがって値を引き継ぐなら文字列型の代わりにオブジェクト型に変えるだけでいけます <script type="text/javascript"> function alterArgs(strLiteral, aryObject) { strLiteral.str = '変更しました'; aryObject.push("three"); } function testParams() { var obj = {"str":"オリジナルの文字列"}; var ary = new Array("one","two"); document.writeln("<h3>呼び出し前の値</h3>"); document.writeln("strの値:" + obj.str + "<br />" ); document.writeln("配列の各要素の値:" + ary + "<br />"); alterArgs(obj,ary); document.writeln("<h3>呼び出し後の値</h3>"); document.writeln("strの値:" + obj.str + "<br />"); document.writeln("配列の各要素の値:" + ary + "<br />"); } testParams() </script> また、場合によってはalterArgs()からの戻り値にstrLiteralしてみたり グローバル変数をつかったりという手もあるでしょう

hironoobu
質問者

お礼

オブジェクト型。 変更後の値を戻り値として戻すやり方について学習が必要と自覚しました。 回答ありがとうございます!!!

関連するQ&A

  • 配列の参照渡し

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文 字列の逆順に入れ替える処理を実現せよ.なお,以下の要件を満たしたプログラムを作 成すること. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa $ ---------------------------------------------------------------------------- (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力せよ. そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替 え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成せよ. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • JavaScript配列の先入れ先出しIEのバグ?

    参考資料はO'REILLY初めてのJavaScript(第2版)です。 function pushPop() { //Fifo待ち行列を作成し、pushを使ってアイテムの追加 var fifoArray = new Array(); fifoArray.push("林檎"); fifoArray.push("バナナ"); var ln = fifoArray.push("桜桃"); //長さと配列を表示 document.writeln("長さは" + ln + "で、行列の順番は" + fifoArray + "です。<br />"); document.writeln("<p>"); //shiftを使って配列からアイテムを外す for (var i = 0; i < ln; i++) { document.writeln(fifoArray.shift() + "を取り出します。今の順番は[" + fifoArray + "]です。<br />"); } //長さを表示 document.writeln("長さは" + fifoArray.length + "となりました<br /><br />"); //次に、popとunshiftも同様に行う var fifoNewArray = new Array(); fifoNewArray.unshift("初めての"); fifoNewArray.unshift("Java"); ln = fifoNewArray.unshift("Script"); document.writeln("長さは" + ln + "で配列は[" + fifoNewArray + "]となりました。<br />"); //pop for (i = 0; i < ln; i++) { document.writeln("「" + fifoNewArray.pop() + "」を取り出します。配列は[ " + fifoNewArray + "]となりました。<br />"); } document.writeln("長さは" + fifoNewArray.length + "となりました。"); document.writeln("</p>"); } Google Chromeでは以下のように書籍通りになりました。 /*---------Google Chrome実行結果---------*/ 長さは3で、行列の順番は林檎,バナナ,桜桃です。 林檎を取り出します。今の順番は[バナナ,桜桃]です。 バナナを取り出します。今の順番は[桜桃]です。 桜桃を取り出します。今の順番は[]です。 長さは0となりました 長さは3で配列は[Script,Java,初めての]となりました。 「初めての」を取り出します。配列は[ Script,Java]となりました。 「Java」を取り出します。配列は[ Script]となりました。 「Script」を取り出します。配列は[ ]となりました。 長さは0となりました。 /*---------Google Chrome実行結果(END)---------*/ IEに関しては、以下のように配列の長さは未定義になり pop(メソッド)を使って配列の最後の要素を削除したいのですができません 長くなりましたが回答の方、宜しくお願いします!!! /*---------IE実行結果---------*/ 長さは3で、行列の順番は林檎,バナナ,桜桃です。 林檎を取り出します。今の順番は[バナナ,桜桃]です。 バナナを取り出します。今の順番は[桜桃]です。 桜桃を取り出します。今の順番は[]です。 長さは0となりました 長さはundefinedで配列は[Script,Java,初めての]となりました。 長さは3となりました。 /*---------IE実行結果(END)---------*/

  • CSSのJavaScript参照

    JavaScriptによって変数に代入された文字列をCSSで参照し、 指定した場所に表示したいのですが、変数名が表示され代入された文字列が表示されません。 ソース <html><head> <title>a</title> <style type="text/css"> <!-- .str{ top:100px; left:10px; position:absolute; }--> </style> </head> <body> <div class="str3">str();</div> //ここで変数strに代入されたaを表示したい <SCRIPT LANGUAGE="JavaScript"> str = "a"; str(){document.write(str);} </SCRIPT></body></html> 初心者のため、間違いが多々あると思いますがよろしくお願いします。

  • javascriptでの文字列操作

    こんにちは。 javascriptでの文字列操作で躓いてしまったのでご教授ください。 例えば、 var str = "00000"; という文字列があったとして、これの2文字目を”1”に変更したいといった場合、javascriptではどのように操作するのが簡単でしょうか。 phpですと、 $str = "00000"; $str[1] = "1"; といった記述で操作できた記憶があるのですが、調べてみても同様の操作が見当たらず・・・。 文字列を分割して+で足すような感じの処理か、配列にして繰り返し処理といった感じになってしまうのでしょうか。 宜しくお願い申し上げます。

  • 二次元配列による文字列の配列の受渡しについての質問です。

    二次元配列による文字列の配列の受渡しについての質問です。 #include <stdio.h> void print_pname(char str[][5], int n) { int i, j; for (i = 0; i < n; i++) { printf("str[%d] = \"", i); for (j = 0; str[i][j] != '\0'; j++) putchar(str[i][j]); printf("\"\n"); } } int main(void) { char ary[][5] = {"Lisp", "C", "Ada"}; print_pname(ary, sizeof(ary) / sizeof(ary[0])); return 0; } 上のプログラム中の関数print_pnameの引数char str[][5]についてですが char (*str)[5](配列のポインタ)と変更した場合にwarningが多数発生します。 これはどうしてでしょうか? また、上のプログラムを配列のポインタを使って変更することは可能でしょうか? 以上、よろしくお願いします。

  • JavaScriptが参照する要素名が配列の場合は?

    下記に示すようなリンクをクリックすると入力欄に入力されるjavascriptを作っているのですが、inputのname属性が配列になっているとうまく参照してくれません。 フォームの生成や送信内容の処理が配列だと都合がよく、なんとかできないかと悩んでいます。html側の要素名を変えずにjavascriptに参照させる方法はないでしょうか。 うまくいく場合の抜粋 function f1(VALUE){ if(!document.MyForm.str1.value){ document.MyForm.str1.value = VALUE; } } <input name="str1" type="text" /> <a href="javascript:f1('単語');">単語</a> うまくいかない場合の抜粋 function f2(VALUE){ if(!document.MyForm.str[1].value){ document.MyForm.str[1].value = VALUE; } } <input name="str[1]" type="text" /> <a href="javascript:f2('単語');">単語</a>

  • fetch_and_downcase

    配列から要素を取り出してその要素に含まれるアルファベットを小文字にして返す というメソッドなんですが・・・ def fetch_and_downcase(ary, index) if str = ary[index] return str.downcase end end ary = ["Boo", "Foo", "Woo"] p fetch_and_downcase(ary, 1) hash = { 0 => "Boo", 1 => "Foo", 2 => "Woo"} p fetch_and_downcase(hash, 1) ↑の内容だとうまく実行できるのですが hash = { :0 => "Boo", :1 => "Foo", :2 => "Woo"} p fetch_and_downcase(hash, :1) ↑のようにハッシュのキーをシンボルにしたり、文字列にすると エラーがでます。 何故でしょうか? ハッシュも要素を参照するときに hash[index] の形式で参照できるので、キーがシンボルであっても うまくいくと思ったのですが、キーが数字でないとうまく 動いてくれません・・・

    • ベストアンサー
    • Ruby
  • JavaScript テキストボックスの入力チェックについて

    JavaScript テキストボックスの入力チェックについて こんにちは、趣味でJavaScriptをしている者です。 テキストボックスに入力した文字列のチェックについて 質問させていただきます。 まず、よろしければ、以下のコードを見ていただきたいのですが・・・ <html> <head> <script type="text/javascript"> var N=5; var str = ""; var moji = new Array("a","b","c","d","e"); var Ary = new Array(); function init(){ for(i=0;i<N;i++) { for(j=0;j<N;j++) { if(j != i){ for(k=0;k<N;k++) { if(k!=i && k!=j){ for(m=0;m<N;m++) { if(m!=i && m!=j && m!=k){ for(n=0;n<N;n++) { if(n!=i && n!=j && n!=k && n!=m){ str = str + moji[i] + moji[j] + moji[k] + moji[m] + moji[n]; Ary.push(str); str =""; } } } } } } } } } alert("並べました"); } function check() { var obj = document.getElementById("txtA"); var key = obj.value; for(i=0;i<Ary.length;i++) { if(key == Ary[i]) { document.getElementById("result").value = key+"は"+(i+1)+"ばんめです"; } } } </script> </head> <body bgColor="rgb(240,220,250)" onLoad="init()"> <form name="Form1"> a,b,c,d,eを辞書式に<br> abcdeからedcbaまで並べるとき<br> テキストボックスに入力した文字列が<br> 何番めになるか表示します <br><br> 文字列を入力: <input type="text" id="txtA" size="10">  <input type="button" value="チェック" onClick="check()"> <br><br>  結果表示 : <input type="text" id="result" size="30"> </form> </body> </html> このコードにおいて、テキストボックスの文字列のチェックが できるようにしたいのです。 *半角英字のa-eであること。 *五文字であること。 *a-eが一度ずつ使われていること。 以上の条件をチェックするには「正規表現」を使えばよいのでしょうか? 「正規表現」についてよくわかりませんので、質問させていただきました。 もしよろしければ、解説していただけないでしょうか。 よろしくお願いします。

  • JavaScript で実体参照を扱うには

    JavaScript 上でたとえば XHTML 上の &nbsp; を含む文字列を生成したい場合、どうコーディングすればよいのでしょうか。 数値参照の場合は String.fromCharCode() などを使用すればコード数値を文字化できるのですが、文字列 "nbsp" あるいは "&nbsp;" を一文字に変換する方法がわかりません。Document.createEntityReference 辺りかなとも思ったのですが、パラメータに何を指定してよいのかよくわかりません。 現在は XHTML 本文にこれを含むテキストを書いておいて、それを一旦 JavaScript で読み込んで連想配列等にして活用する形で使っているのですが、もう少し直截的に生成したいと思っています。 よろしくお願いいたします。

  • 文字列にある数字を判別するにはどうすればいいでしょうか?

    文字列にある数字を判別するにはどうすればいいでしょうか? 例え:[今年は2010年7月21日です]という文字列有ります。 この文字列の中で数字が6個ありますが、 どのような方法で判別することが可能でしょうか? ActionScript2.0です。 自分の考えては、とりあえず文字列を配列にする必要があると思い、 ary = str.split("");にしました。 その後、forなどを利用して配列を一個ずつ呼び出して、数字か文字かを判別し、数字がいくつあるかを わかりたいですが、、、うまくできません。 是非、よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう