- ベストアンサー
Javascriptで コピー・参照の事例?
値と参照の動作がわからないのですが、 func copy(mono) { var x = mono; } の時、xは monoのコピーでしょうか?参照でしょうか? monoは オブジェクト 配列 文字列 数値 ture, false null それぞれについても知りたいです。 このように、値と参照の区別しなければいけない問題は他にあるでしょうか?
- みんなの回答 (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)
いわゆる深いコピーをしたいと言うことですね。 残念ながら私は深いコピーを簡単にできる方法を聞いたことがありません。 たぶん、地道にそういうメソッドなりを自分で実装するしかないような気がします。
- Werner
- ベストアンサー率53% (395/735)
基本データ型(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; //よってここは呼び出し元には影響しない }
お礼
ありがとうございます。 法則はわかったのですが、実際にオブジェクト・配列の複製を簡単に作りたいのですが、汎用的に使える方法はありますか? b = a は、参照コピーですが、 b.clone(a) とかでJavascriptではできないのでしょうか?