JavaScript では、オブジェクト変数間のすべての代入はアドレスを渡します。どのオブジェクトがオブジェクトなのかを尋ねる生徒もいるかもしれません。例を挙げた方がよいかもしれません:
実際、ディープコピーで処理する必要がある主なオブジェクトは、オブジェクト以外のオブジェクトであり、通常は直接割り当てる必要があります。 js ディープ コピーの実装に関する私のアイデアは次のとおりです:
オブジェクトのすべてのプロパティを走査します。
属性が「オブジェクト」の場合、特別な処理が必要です。
このオブジェクトが特別で配列である場合は、新しい配列を作成し、配列内の要素を深くコピーします
このオブジェクトが非配列オブジェクトの場合は、そのオブジェクトに対してディープ コピー メソッドを再帰的に呼び出します。
「オブジェクト」でない場合は、普通にコピーしてください。
以下は私の実装です:
(この中の属性) {
If (this.hasOwnProperty(attr)) {
If (typeof(this[attr]) === "オブジェクト") {
If (this[attr] === null) {
obj[attr] = null;
}
else if (Object.prototype.toString.call(this[attr]) === '[オブジェクト配列]') {
obj[attr] = [];
for (i=0; i
}
} else {
obj[attr] = this[attr].DeepCopy();
}
} else {
obj[attr] = this[attr];
}
}
}
obj を返します;
};
ブラウザが ECMAScript 5 をサポートしている場合、オブジェクト プロパティのすべてのプロパティをディープ コピーするには、
を使用できます。を
に置き換えますこのメソッドを Object.prototype に直接実装する利点は、すべてのオブジェクトがこのメソッドを継承することです。欠点は、ライブラリによっては Object オブジェクトも書き換えるため、競合が発生する場合があることです。これは注意すべきことです。具体的な利用方法は以下の通りです。
上記はディープコピーについての説明ですが、今日はディープコピーについて話したので、シャローコピーにも対応したいと思います。
浅いコピー (シャドウ クローン): オブジェクトの基本タイプとオブジェクト タイプのみがコピーされ、元の参照に属します。
ディープコピー (ディープクローン): オブジェクトの基本クラスをコピーするだけでなく、元のオブジェクト内のオブジェクトもコピーします。つまり、まったく新しいオブジェクトが生成されます。