關(guān)于JS的深淺拷貝

JS關(guān)于基礎(chǔ)類型和引用類型的數(shù)據(jù)請點擊:JS數(shù)據(jù)類型
請充分理解之后再來看這篇文章哦~

基本類型的拷貝

先來看一段非常經(jīng)典的代碼

var a = 1;
var b = a;
a = 200;
console.log(a);      //200
console.log(b);      //1

我們應(yīng)該知道基本類型“按值傳遞”,引用類型“按引用傳遞”,數(shù)值作為基本類型是保存在棧內(nèi)存中,可以直接拿來用的,賦值是什么那么之后就一直是什么,不會受到傳遞元素的改變帶來的影響,所以這里就不難理解上面的代碼得到的值的原因了。

引用類型的拷貝

簡單說,引用類型是生成一個指針保存的堆內(nèi)存中,當(dāng)給引用類型賦值時,我們寫的內(nèi)容是在棧內(nèi)存中,也就是說我們拿到的其實是一個指針(不會直接拿到棧內(nèi)存中的內(nèi)容)。這個指針是指向棧內(nèi)存中這個引用類型的代碼。
提到拷貝涉及到的兩種拷貝類型:深拷貝和淺拷貝

淺拷貝

淺拷貝針對對象中的基本類型的值生效,但是對引用類型中還有引用類型的情況就會失效。

var a = {
  name:"mary",
  age:20,
  hobby:"eat"
}

function shadowCopy(obj){
  var newObj = {};
  for(var key in obj){
     newObj[key] = obj[key];
  }
  return newObj;
}
var b = shadowCopy(a);
console.log(b)

這是得到的就是一個和a完全一樣的對象,這個函數(shù)就是一個淺拷貝函數(shù)。

深拷貝

深拷貝是針對對象中還有引用類型的情況,使用深拷貝可以使新創(chuàng)建的對象和原來的完全脫離關(guān)系

var a = {
  name:"mary",
  age:20,
  friend:{
    name:"哈哈",
    age:19,
    hobby:"eat"
  }
}

function deep(obj){
  var newobj = {};
  for(var key in obj){
    if(obj.hasOwnProperty(key)){
      if(typeof obj[key] === "number" || typeof obj[key] === "string" || typeof obj[key] === "boolean" || obj[key] === undefined || obj[key] === null){
         newobj[key] = obj[key];
      }else{
        newobj[key] = deep(obj[key]);
      }
    }
  }
  return newobj;
}
var b = deep(a);
a.friend.age = 29;        //此處修改了a對象中的某個值,但是經(jīng)過函數(shù)處理,b里面的這個值不會發(fā)生改變
console.log(a);
console.log(b);

里面的hasOwnProperty這個屬性請參考 MDN的解釋

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1.寫一個NSString類的實現(xiàn) +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,805評論 2 37
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,734評論 0 11
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,217評論 30 472
  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,376評論 0 6
  • 307、setValue:forKey和setObject:forKey的區(qū)別是什么? 答:1, setObjec...
    AlanGe閱讀 1,592評論 0 1