型の割り当ては、変数の受け渡しの問題に似ています。
言うまでもなく、基本的なデータ型は値渡しです。
var a=5; b=a ;
b=3;
alert(a);//ヒント 5
alert(b);//ヒント 3
この観点から、変数の値は前後に渡され、変数自体とは何の関係もないため、b を変更しても a は変更されないことがわかります。
オブジェクトタイプ、パスバイアドレス。
var a=new Object(); 🎜>a.x =5;
var b=a;
b.x=3;
alert(a.x);//プロンプト 3
alert(b.x);//プロンプト 3
このように、アドレスの受け渡しにより、bはa、aはbとなり、相互に変化します。
まだ不明な場合は、別の例を示します:
var a=new Object();
a.x=5;
var b=a;
alert(b.x);//プロンプト 5、b.x は両方とも 5
a.x=3 ;// a.x を b.x に変更します。両方とも 3
alert(a.x);// プロンプト 3
alert(b.x);// プロンプト 3
ただし、オブジェクト タイプ 互いのプロパティへの値の割り当ては、オブジェクト タイプとは関係なく、むしろそのプロパティのタイプと関係があります。
属性が基本データ型の場合は値が渡され、属性がオブジェクト型の場合はアドレスが渡されます。たとえば、簡単にしてみましょう:
var a=new Object(); var b=new Object();
alert(a.x); (b.x); //ヒント 3
上記で前後に割り当てられているものは、両方とも互いに分離されており、基本的なデータ型にすぎません。値を相互に転送し、相互に影響を与えることはありません。
コードをコピーします
alert(b);//prompt 3
これも同様で、b の基本データ型と a の基本データ型の属性 x は互いに影響を与えず、値を転送するだけです。他の。
ただし、オブジェクトのプロパティもオブジェクト型である場合、それらもアドレスによって渡されます。
コードをコピーします
コードは次のとおりです。
alert(a.x.n);//プロンプト 3
alert(b.n);//プロンプト 3
オブジェクトの属性 x は、Object オブジェクト タイプとして定義されます。したがって、b に値 a.x が割り当てられている場合、それらは実際には同じものであり、相互に影響を与えたり、変更したりすることができます。
————
しかし、オブジェクト型変数に値を割り当てたい場合は、「あなたは私、私はあなた」という高貴な性格の領域に到達するのではなく、属性をコピーするだけです。 「生きるも死ぬも一緒」の。何をするか?
特に良い方法はありませんが、以下の関数を使用してください。
コードをコピー
コードは次のとおりです:
var DeepCopy = function(destination, source) { for (ソースの var プロパティ) { var copy = source[property]; if ( destination === copy ) continue; == " オブジェクト" )
{
destination[property] = DeepCopy(destination[property] || {}, copy);
else
; >}
戻り先 🎜>
コードは次のとおりです。 >var b=new Object;
DeepCopy (b,a);
alert(b.x);//プロンプト 5
alert(b.y);//プロンプト 3
b.x=8; >alert(a.x);//プロンプト 5
ほら、b.x を変更しても a.x には影響しませんよね?
この DeepCopy は良い機能です。
上記は、オブジェクト型のシミュレートされた「値による受け渡し」を実装しています。
では、基本的なデータ型の「アドレスによる受け渡し」をどのようにシミュレートできるでしょうか?
Array オブジェクトを使用するだけです。
関数変更(a)
{
a[0]=5;
alert(a); // ヒント 5
}
var x=[3]; // ヒント 3
change( x);
alert(x); // ヒント 5
[xx] を割り当てることは、実際には Array オブジェクトにデータを割り当てることです。ここでは、1 つの要素を含む配列を使用してアドレス転送をシミュレートします。配列はオブジェクト型なので、渡す際はアドレスで渡します。
もちろん、任意のオブジェクト タイプのプロパティを使用してシミュレートすることもできます。