JavaScriptでは、オブジェクト変数間のすべての割り当てがアドレスを通して渡されます。一部の学生は、どのオブジェクトオブジェクトがどのオブジェクトであるかを尋ねることがあります。例を挙げる方が良いかもしれません:
コードコピーは次のとおりです。
typeof(true)// "boolean"
typeof(1)// "number"
typeof( "1")// "string"
typeof({})// "object"
typeof([])// "object"
typeof(null)//「オブジェクト」
typeof(function(){})// "function"
したがって、実際には、詳細なコピーを処理する必要があるオブジェクトはオブジェクトオブジェクトであり、非オブジェクトオブジェクトは直接かつ正常に割り当てられます。 JSの深い複製を実装するという私の考えは、次のとおりです。
このオブジェクトのすべてのプロパティを繰り返し、
プロパティが「オブジェクト」の場合、特別な処理が必要です。
このオブジェクトオブジェクトが特別で配列である場合は、新しい配列を作成し、配列内の要素を深くコピーします。
このオブジェクトオブジェクトがアレイ以外のオブジェクトである場合は、ディープコピーメソッドを再帰的に呼び出してください。
「オブジェクト」ではない場合は、正常にコピーするだけです。
これが私の実装です:
コードコピーは次のとおりです。
object.prototype.deepcopy = function(){
var obj、i;
obj = {};
for(これでattr){
if(this.hasownproperty(attr)){
if(typeof(this [attr])=== "object"){
if(this [attr] === null){
obj [attr] = null;
}
else if(object.prototype.tosttring.call(this [attr])=== '[object array]'){
obj [attr] = [];
for(i = 0; i <this [attr] .length; i ++){
obj [attr] .push(this [attr] [i] .deepcopy());
}
} それ以外 {
obj [attr] = this [attr] .deepcopy();
}
} それ以外 {
obj [attr] = this [attr];
}
}
}
OBJを返します。
};
ブラウザがECMAScript 5をサポートしている場合、オブジェクトプロパティのすべての機能を深くコピーするために使用できます
コードコピーは次のとおりです。
object.defineProperty(obj、attr、object.getownpropertydescriptor(this、attr));
交換します
コードコピーは次のとおりです。
obj [attr] = this [attr];
このメソッドをオブジェクトに直接実装する利点は、すべてのオブジェクトがメソッドを継承することです。欠点は、一部のライブラリもオブジェクトオブジェクトを書き換えるため、競合が発生する場合があることです。これに注意を払う必要があります。特定の使用方法は次のとおりです。
コードコピーは次のとおりです。
object.prototype.deepcopy = function(){...}
var a = {x:1};
var b = a;
var c = a.deepcopy();
ax = 2;
Bx = 3;
console.log(ax); // 3
console.log(bx); // 3
console.log(cx); // 1
上記は、深い複製に関する説明です。ただし、今日は深い複製について話していたので、それに応じて浅い複製が必要です。それらの類似点と相違点を簡単に要約しましょう。
浅いコピー(シャドウクローニング):オブジェクトの基本タイプのみをコピーし、オブジェクトタイプはまだ元の参照に属します。
ディープコピー(ディープクローニング):オブジェクトの基本クラスをコピーするのではなく、元のオブジェクトのオブジェクトをコピーします。つまり、新しいオブジェクトによって完全に生成されます。