Open LeoWangJ opened 4 years ago
淺拷貝: 僅能拷貝物件中第一層的資料,第二層以後的資料一樣會與舊的物件共用相同參考(reference)。
深拷貝:複製一個物件,使得兩個物件的參考完全沒有相關(不共用相同記憶體)。
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的值也一起被修改了
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或者自行實作(敬請期待)
淺拷貝: 僅能拷貝物件中第一層的資料,第二層以後的資料一樣會與舊的物件共用相同參考(reference)。
深拷貝:複製一個物件,使得兩個物件的參考完全沒有相關(不共用相同記憶體)。
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的值也一起被修改了
但這種方式進行深拷貝的話,有些資料是無法複製的ex: function,Date,正則 ...等
原因是JSON格式沒有提供上述方式,所以在轉換時會被忽略,導致無法複製。
那麼要怎麼解決無法複製的那些值呢?
可以使用lodash提供的_. cloneDeep或者自行實作(敬請期待)