• ベストアンサー

Javascriptで コピー・参照の事例?

値と参照の動作がわからないのですが、 func copy(mono) { var x = mono; } の時、xは monoのコピーでしょうか?参照でしょうか? monoは オブジェクト 配列 文字列 数値 ture, false null それぞれについても知りたいです。 このように、値と参照の区別しなければいけない問題は他にあるでしょうか?

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

  • ベストアンサー
回答No.3

> の時、xは monoのコピーでしょうか?参照でしょうか? は割愛。 DOMオブジェクトならcloneNode()が使えます。 配列はfor(var i=0;i<array.length;i++){}などで1つずつコピー オブジェクト型はfor(var i in obj){}で1つずつコピー var a={abc:'hoge',def:'page'}; a[0]('apple'); a[1]('orange'); というオブジェクトを作った場合は、 for(var i in a){ b[i]=a[i];} と for(var i=0;i<a.length;i++){ b[i]=a[i];} の両方しないと、 プロパティーの部分a['abc']、a['def']と配列部分のa[0]、a[1]の全てがコピーされません。(Safariだけかもしれません) 2次元以上の配列やプロパティーがネストした場合はかなり面倒になると思います。 関数やメソッドを作った方が使いやすいと思います。 prototype.jsを使うと、Arrayオブジェクトに配列をコピーするメソッドが定義されます (for(var i=0;i<obj.length;i++){}でコピーしているだけです)

その他の回答 (2)

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

いわゆる深いコピーをしたいと言うことですね。 残念ながら私は深いコピーを簡単にできる方法を聞いたことがありません。 たぶん、地道にそういうメソッドなりを自分で実装するしかないような気がします。

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

基本データ型(number、boolean、string、undefined)は値渡し、 オブジェクト型(Object、Arrayなど)は参照渡しと考えて基本的に問題ないと思います。 以下のようなプログラムを書いてみれば、どんな動作をするのか確認できると思います。。 ------------------------------------------------------- //オブジェクト a=new Object(); a.temp=1; b=a; //aとbは同じオブジェクトを指す b.temp=2; alert(a.temp); //配列オブジェクト a=new Array(); a[0]="before"; b=a; //aとbは同じ配列オブジェクトを指す b[0]="after"; alert(a[0]); //関数内での変更 a=new Array(); a[0]=1; f1(a); alert(a[0]); function f1(x){ x[0]=2; //これは呼び出し元に影響する x=new Array(); //この時点でxは新しい配列オブジェクトを指すようになる x[0]=3; //よってここは呼び出し元には影響しない }

nati_desu
質問者

お礼

ありがとうございます。 法則はわかったのですが、実際にオブジェクト・配列の複製を簡単に作りたいのですが、汎用的に使える方法はありますか? b = a は、参照コピーですが、 b.clone(a) とかでJavascriptではできないのでしょうか?

関連するQ&A

  • JavaScriptでObjectを参照する

    JavaScriptでObjectを参照する変数を使いたいのですが、どうすればいいでしょうか? 具体的には以下のように出いたら理想なのですが… var fish = ['pike','horseMackerel','salmon']; for (var i = -1; ++i < fish.length;) { // 実際はHTML elementsを HTML格納用配列にPushする console.log(result.date.fish[i]); } // ここで、innerHTMLでHTML格納用配列をjoinして挿入 当然ながら、Objectのresult.dateにはfish[i]というのはないのでエラーになります。 result.date.pikeとすればデータは参照できます。 ループ内でresult.date.fish[i]のように変数をあててObjectを参照したい場合は、どのように書けばいいのか教えてください。 ご教示の程よろしくお願いします。

  • オブジェクト型とプリミティブ型について

    オブジェクト型とプリミティブ型について プリミティブ型は Javascriptにおけるプリミティブ型とは、下記は値そのものが入っている。 * 数値型 * 文字列型 * ブーリアン型 * null型 * undefined型 上記5つのどれかその物が入っている オブジェクト型は配列がこれなのはわかるのですがオブジェクトもオブジェクト型なのでしょうか?他にもありますか? こちらや値そのものが入っておらず、アドレスのみが入っているのですよね?

  • javascriptにおける配列のコピー

    javascriptにおける配列のコピーについて質問です。 調べてみると、配列のコピーは破壊・非破壊の区別が あるのまでは理解しました。 非破壊のコピーをしたいので、 Array.prototype.clone = function(){ return Array.apply(null,this) } を用意して、3次元配列をコピーしたのですが、 コピーした配列のデータを変えたりしたら、 元の配列も変わって(破壊的)ました。。 このclone関数は多次元では破壊的になってしまうのですか? ちなみに、aaa[0~10][0~10][0~10]として、 var bbb; bbb = aaa.clone();で行いました。 教えてください、お願いします!

  • javascript 親オブジェクトと子オブジェクトを分離させたい

    例えばjavascriptで下のようなコードを書いたとします。 a=new Array() a[0]=new OBJ(); function OBJ(){ this.prop=document.getElementById('aaa') this.prop2=document.getElementById('bbb') } a[0].prop.addEventListener(click,func,false); function func(){ ??? } func()関数内でthisを使うとa[0].propを参照できます。 一方、a[0].prop2を参照するにはどうすればいいのでしょうか? 配列の要素番号を指定しないで参照させる方法が分からず悩んでいます。 下のようにもしできるのであればいいのですが。。。 a[0]とpropのオブジェクトを分割->a[0]オブジェクトを抜き出し-> a[0]オブジェクトにprop2を追加 または別の方法があるのでしょうか。 ぜひぜひご回答のほどお願いいたします。

  • 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

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

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

  • [JS] private関数からオブジェクト参照

    JavaScriptにて外部から使用する関数をpublicに、内部的に使用するだけの関数をprivateにしたく、 <http://d.hatena.ne.jp/brazil/20051028/1130468761>や<http://www.findxfine.com/programming/javascript/59.html>を参考に以下のようにしてみました。 func1はtestクラス内からしか呼び出せず、privateになっており、 func2はtestクラス外からも呼び出せて、publicになっているようです。 しかし、func2からfunc1を呼び出した際に、func2の呼び出しもとのオブジェクトを参照しようとすると undefinedになってしまいます。 var a = new test(); //a.func1(); // これはprivateなのでエラー a.func2(); // こちらはpublicなのでOK function test(){ var self = this; // private variable var data1 = 1; // public variable this.data2 = 2; // private function function func1(){ console.log(data1); // 1を表示 console.log(this.data2); // これがundefinedとなってしまう } // public function this.func2 = function(){ console.log(data1); // 1を表示 console.log(this.data2); // 2を表示 func1(); }; } どのようにすれば、オブジェクト変数を参照でき、 クラス内でのみ使用可能なprivate関数を定義できるのでしょうか。

  • フレーム内のアプレットの参照ができない

    <frameset rows="*,100"> <frame src="Q0001.html" name="main"> <frame src="navigator.html" name="navigator"> </frameset> 上記のフレーム構成で、Q0001.html から navigator.html のアプレット、name="ResultRegister" を参照しようとしています。 var objElement = window.top.navigator.getElementsByName("ResultRegister"); で参照しようとすると、「オブジェクトでサポートされていないプロパティ、又はメソッドです」となり var objElement = window.top.navigator.document.getElementsByName("ResultRegister"); で参照しようとすると、「window.top.navigator.documentは、Null又はオブジェクトではありません」となり 参照できません。 どのように参照したらよいのでしょうか? 宜しくお願いします。

  • Javascript; フィールドの属性変更

    作成したフォームに対してJavaScriptでの処理を行おうとしています。 セットした社名やDB検索した値の属性変更をしたいのですが、下記エラーが表示されます。 どのような対策がございますか? SCRIPT5007: プロパティ 'readOnly' の値を設定できません: オブジェクトは Null または未定義です。 SCRIPT5007: プロパティ 'onchange' の値を設定できません: オブジェクトは Null または未定義です。 下記のJavaScriptでの処理を行おうとしています。 function SetEvent() { document.getElementById("CompanyTextBox").readOnly="readonly";  //ここで、エラーになります。 //DB検索処理........ //配列 var counter = 0; var code = new Array(); for (var i = 0; i <10; i++) { code[i] = new Array(); code[i][0] = 'TextBox' + ((i * 4) + 1); code[i][1] = 'TextBox' + ((i * 4) + 2); document.getElementById(code[i][1]).readOnly="readonly"; //ここで、エラーになります。 } //検索結果のセット do { var elem = document.getElementById(code[counter][0]); elem.onchange = function(event) //ここで、エラーになります。 ・ ・ counter++; } while(counter < 10) }

  • 参照先の計算式のコピーをしたいけど・・・

    エクセル2002です。 前の会社のパソコンでできていたことが、今の会社のパソコンでできなくて困っています。 やりたいことは参照元からの計算式のコピーで、参照元も移動してコピーさせたいという事です。 例えばAの列の1~5まで「他ブック」から参照(リンク)した数値(計算式)が入っていたとします。 そのままB列にA1~5をコピーして貼り付けると、参照元は動かずに表示される(A列と同じ値)ようになっています。 これを他セルやシートのコピー時のように、参照元も移動してコピーさせたいのですが可能でしょうか? ちなみにセルの右下にマウスをあわせて「+」表示を引っ張ってコピーさせるやつとかです。 ※この方法にこだわりはありません。別の方法で簡単にできるのがあったらそれでも良いので教えていただけるとありがたいです。 よろしくお願い致します。

専門家に質問してみよう