LeoWangJ / blog

紀錄學習文章
1 stars 0 forks source link

淺拷貝與深拷貝 #22

Open LeoWangJ opened 4 years ago

LeoWangJ commented 4 years ago

淺拷貝: 僅能拷貝物件中第一層的資料,第二層以後的資料一樣會與舊的物件共用相同參考(reference)。

深拷貝:複製一個物件,使得兩個物件的參考完全沒有相關(不共用相同記憶體)。

  1. Object.assign : 屬於淺拷貝
var obj = { 
    name:'leo',
    child:{
         name:'jack'
    }
}

var obj2 = Object.assign({},obj)
console.log(obj2) // 與obj值相同,代表成功複製

obj2.name = 'change' 
console.log(obj.name)  // leo,obj值未被修改

obj2.child.name = 'fake' 
console.log(obj.child.name) // fake,修改obj2的值但obj的值也一起被修改了 
  1. 使用展開運算子複製物件 : 屬於淺拷貝
    
    var obj = { 
    name:'leo',
    child:{
         name:'jack'
    }
    }

var obj2 = {...obj} // 展開運算子複製物件 console.log(obj2) // 與obj值相同,代表成功複製

obj2.name = 'change' console.log(obj.name) // leo,obj值未被修改

obj2.child.name = 'fake' console.log(obj.child.name) // fake,修改obj2的值但obj的值也一起被修改了

3. 使用JSON.parse(JSON.stringify())複製 :屬於深拷貝

```js
var obj = { 
    name:'leo',
    child:{
         name:'jack'
    }
}

var obj2 =JSON.parse(JSON.stringify(obj))// JSON.parse與JSON.stringify進行複製
console.log(obj2) // 與obj值相同,代表成功複製

obj2.name = 'change' 
console.log(obj.name)  // leo,obj值未被修改

obj2.child.name = 'fake' 
console.log(obj.child.name) // jack,obj值未被修改,是我們想要的效果

但這種方式進行深拷貝的話,有些資料是無法複製的ex: function,Date,正則 ...等
原因是JSON格式沒有提供上述方式,所以在轉換時會被忽略,導致無法複製。
那麼要怎麼解決無法複製的那些值呢?
可以使用lodash提供的_. cloneDeep或者自行實作(敬請期待)