一、什么是拷貝?什么是深拷貝和淺拷貝?
(1)拷貝:拷貝就是為了復用原對象的部分or全部數據,在原對象的基礎上通過復制的方式創建一個新的對象。
拷貝對象可以分為三種類型:直接賦值、淺拷貝和深拷貝
?(2)直接賦值:并不會創建一個新的對象,而是將原對象的引用賦給新變量。因此,修改新變量會影響到原對象。
let obj1 = { name: "Alice", age: 25 }; let obj2 = obj1;obj2.age = 30; console.log(obj1); // { name: "Alice", age: 30 } console.log(obj2); // { name: "Alice", age: 30 }
(3)淺拷貝:淺拷貝會創建一個新的對象,僅復制對象的第一層屬性。如果是簡單數據類型拷貝值,引用數據類型(eg:對象、數組)拷貝的是地址。?如果是單層對象,沒問題,如果有多層就有問題,修改嵌套對象會影響原對象。
?
(4)深拷貝:會創建一個新的對象,并且遞歸地拷貝所有嵌套對象,使得新對象與原對象完全獨立。
????????(深拷貝會開辟新的棧,兩個對象對應兩個不同的地址,修改對象A的屬性,并不會影響到對象B。)
?
二、淺拷貝實現方法
????????淺拷貝會創建一個新的對象,但新對象中的屬性如果是對象,則這些屬性仍然指向原對象中的對應屬性。因此,修改嵌套對象會影響到原對象。
1、Object.assign()?
let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = Object.assign({}, obj1);obj2.age = 30;
obj2.address.city = "London";console.log(obj1); // { name: "Alice", age: 25, address: { city: "London" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }
2、使用展開運算符(...)實現?
let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = { ...obj1 };obj2.age = 30;
obj2.address.city = "London";console.log(obj1); // { name: "Alice", age: 25, address: { city: "London" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }
三、深拷貝實現方法
????????深拷貝會創建一個新的對象,并且遞歸地拷貝所有嵌套對象,使得新對象與原對象完全獨立。
1、通過遞歸實現深拷貝
如果一個函數在內部可以調用其本身,那么這個函數就是遞歸函數

2、使用?JSON.parse
?和?JSON.stringify
?實現?
let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = JSON.parse(JSON.stringify(obj1));obj2.age = 30;
obj2.address.city = "London";console.log(obj1); // { name: "Alice", age: 25, address: { city: "New York" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }
3、js庫lodash里面cloneDeep內部實現了深拷貝?
import _ from 'lodash';
let obj = { a: 1, b: [2, 3] };
let copy = _.cloneDeep(obj);