原則のディープコピー

 

1.最初のタイプ判定が行われ 

 もし(OBJ == nullのリターンOBJ。
   場合(正規表現のinstanceof objを)     返す  新しい  正規表現(OBJ)を、
   場合(OBJのinstanceof日)が        返す  新しい  (OBJ)日。
   // ... 
   場合typeof演算!OBJ == ' オブジェクト'の戻り   OBJ。

2裁判官は、アレイまたはオブジェクトであります 

インスタンス=ましょう新しい   obj.constructorを。

デモ 

関数deepClone(OBJ、ハッシュ= 新しいWeakMap()){
    場合(OBJ == NULL戻りOBJ。
   場合(正規表現のinstanceof objを)     返す  新しい  正規表現(OBJ)を、
   場合(OBJのinstanceof日)が        返す  新しい  (OBJ)日。
   // ... 
   場合typeof演算!OBJ == ' オブジェクト'の戻り  OBJ。

   インスタンスが聞かせて   = 新しい  obj.constructor。

//     もし(hash.has(OBJ))戻りhash.get(OBJ)。
//    hash.set(OBJ、インスタンス)。
//     (OBJでCONST鍵)の{
 //         もし(obj.hasOwnProperty(キー)){
 //             インスタンス[キー] = deepClone(OBJ [キー]、ハッシュ)。
//         }
 //     } 
   戻り  インスタンス。
  } 
にconsole.log(deepClone({:1、B:2、C:{C:1 }}))。
console.log(deepClone([ 1234 ]))。

出力:

{}
[]
 
3に.....ためのアレイまたはアレイの使用を横切ります  
 
4.コピー
   CONSTキーOBJ){
        場合(obj.hasOwnProperty)(キー){ 
           インスタンス[キー] = deepClone(OBJ [キー]、ハッシュ)。
       } 
   }

5。  

 もし(hash.has(OBJ))    戻りハッシュ。取得(OBJ)。
   ハッシュ。セット(OBJ、インスタンス)。

ここでもし復帰のコピーのコピーがあったかどうかを決定することです

マッピング 

 
 
完全なデモ:
 
関数deepClone(OBJ、ハッシュ= 新しいWeakMap()){
    場合(OBJ == NULL戻りOBJ。
   場合(正規表現のinstanceof objを)     返す  新しい  正規表現(OBJ)を、
   場合(OBJのinstanceof日)が        返す  新しい  (OBJ)日。
   // ... 
   場合typeof演算!OBJ == ' オブジェクト'の戻り  OBJ。

   インスタンスが聞かせて   = 新しい  obj.constructor。

   もし(hash.has(OBJ))    戻りハッシュ。取得(OBJ)。
   ハッシュを。セット(OBJ、インスタンス)。
   CONSTキーOBJ){
        場合(obj.hasOwnProperty)(キー){ 
           インスタンス[キー] = deepClone(OBJ [キー]、ハッシュ)。
       } 
   } 
   戻り  インスタンス。
  } 
にconsole.log(deepClone({:1、B:2、C:{C:1 }}))。
console.log(deepClone([ 1234 ]))。

出力:

 

{1、B:2、C:{C:1}}
[1、2、3、4]

 

おすすめ

転載: www.cnblogs.com/guangzhou11/p/11328261.html