js深さクローンと浅いクローン


「JavaScriptを使ってオブジェクトを深さでクローンします.」これは出現確率の高い面接問題です.以下に、両者の違いとそのコードをまとめます.
一般的には2つの異なるデータタイプの値があります.基本タイプ(undefined、Null、bollan、String、Numberを含む)は、値によって伝えられます.参照の種類(配列、オブジェクトを含む)は、アドレスによって伝達され、参照の種類は、値が伝達されるときにメモリ内のアドレスである.
1.概念
浅いクローン:基本タイプは値伝達で、オブジェクトは依然として参照伝達である.
深さクローン:すべての要素や属性が完全にクローンされ、元の参照の種類からは完全に独立しています.つまり、オブジェクトの属性が後から変更された場合、元のオブジェクトは変更されません.
深さクローンとは、オブジェクトの中のものをそっくり別のオブジェクトにコピーし、それぞれメモリの違いに置くことです.
深さクローンであれ、浅いクローンであれ、直接クローンをコピーすればいいです.一つのコピーは不潔で、その値だけをコピーしますが、もう一つのコピーは比較的徹底的で、直接にその属性などもコピーします.
2.コード
浅いクローン:
//       
var a="1";
var b=a;
b="2";
console.log(a);// "1"
console.log(b);// "2"
//        
var c="1";
var d=c;
d="2";
console.log(c);// "1"
console.log(d);// "2"
//        
var x=true;
var y=x;
y=false;
console.log(x);// true
console.log(y);// false
//      
var m=function(){alert(1);};
var n=m;
n=function(){
    alert(2);
};
console.log(m());//1
console.log(n());//2
以上は、浅いクローンの表現であり、基本的には基本的なタイプの値を伝えるものであり、対象は依然として引用を伝達するものである.
深さクローン:
//        
function cloneObject(o) {
  if(!o || 'object' !== typeof o) {
      return o;
  }
  var c = 'function' === typeof o.pop ? [] : {};
  var p, v;
  for(p in o) {
      if(o.hasOwnProperty(p)) {
          v = o[p];
          if(v && 'object' === typeof v) {
              c[p] = Ext.ux.clone(v);
          }
          else {
              c[p] = v;
          }
      }
  }
  return c;
};
jsコードはJSONオブジェクトの深さクローンを実現し、新しいオブジェクトを返します.
function cloneObj(obj){
    var newobj = obj.constructor === Object ? {} : [];
    if(typeof JSON === 'object'){
        var s = JSON.stringify(obj), //     
        newobj = JSON.parse(s); //    (  )
    }else{
        if(newobj.constructor === Array){
            newobj.concat(obj);
        }else{
            for(var i in obj){
                newobj[i] = obj[i];
            }
        }
    }
    return newobj;
}