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([ 1、2、3、4 ]))。
出力:
{}
[]
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([ 1、2、3、4 ]))。
出力:
{1、B:2、C:{C:1}}
[1、2、3、4]