Javascript中的深拷貝與淺拷貝

javascript中的深拷貝與淺拷貝

什麼是淺拷貝?什麼是深拷貝?

1.淺拷貝:淺拷貝是拷貝引用,拷貝後的引用都是指向同一個對象的實例,彼此之間的操做會互相影響。javascript

//這裏的賦值僅僅只是把obj1的內存地址指向了obj。
var obj={name:'zhangsan',age:24}
var obj1=obj;
console.log(obj1.name);//zhangsan

//改變obj1中name的值,obj中name的值也跟着發生改變
obj1.name='lisi';
console.log(obj.name)//lisi
consloe.log(obj1.mane)//lisi

像上面這種直接賦值的方式就是淺拷貝,此時會發現,obj1的值發生改變,原來的obj也會跟着發生改變。可是不少狀況下咱們想要的不是這種狀況,僅僅只是把原對象的值拷貝過來當改變obj1時,obj並不須要跟着改變。此時,就須要用到了深拷貝。java

2.深拷貝:在堆中從新分配內存,而且把源對象全部屬性都進行新建拷貝,以保證深拷貝的對象的引用圖不包含任何原有對象或對象圖上的任何對象,拷貝後的對象與原來的對象是徹底隔離,互不影響。markdown

//深拷貝就是不緊複製對象的基本類,同時也複製原對象中的對象.
//就是說徹底是新對象產生的,新對象所指向的不是原來對像的地址。


function deepCopy(a, b) {
  var b = b || {};
  for (var i in a) {
    if (typeof a[i] === 'object') {
      b[i] = (a[i].constructor === Array) ? [] : {};
      deepCopy(a[i], b[i]);
    } else {
       b[i] = a[i];
    }
  }
  return b;
}

var arr =['zhangsan','lisi','wangwu'];
var newArr=deepCopy(arr,newArr);

console.log(arr[1]);//lisi
console.log(newArr[1]);//lisi

newArr[1]='zhaoliu';
console.log(arr[1]);//lisi
console.log(newArr[1]);//zhaoliu 
相關文章
相關標籤/搜索