一、定義:
淺拷貝:只復制對象的第一層屬性,若第一層屬性是引用類型(如對象、數組),則復制其內存地址,修改拷貝后的嵌套對象會影響原對象。
深拷貝:遞歸復制對象的所有層級,生成完全獨立的副本
二、淺拷貝實現
1.Object.assign()
const obj = { a: 1, b: { c: 2 } };
const clone = Object.assign({}, obj); // 淺拷貝
clone.b.c = 3; // 原對象的 b.c 也會變為 3
console.log("obj: ", obj)
console.log("clone: ", clone)
2.展開運算符
const arr = [1, 2, 3];
const newArr = [...arr]; // 淺拷貝
newArr[2] = 4;
console.log("arr: ", arr)
console.log("newArr: ", newArr)
const arr = [1, 2, { a: 3 }];
const newArr = [...arr]; // 淺拷貝
newArr[2].a = 4; // 原數組的 { a: 3 } 變為 { a: 4 }
console.log("arr: ", arr)
console.log("newArr: ", newArr)
3.數組方法:slice, concat
slice:
const arr = [1, 2, { a: 3 }];
const newArr = arr.slice(); // 淺拷貝
newArr[2].a = 4
console.log("arr: ", arr)
console.log("newArr: ", newArr)
concat:
const arr = [1, 2, { a: 3 }];
const newArr = arr.concat(); // 淺拷貝
newArr[2].a = 4
console.log("arr: ", arr)
console.log("newArr: ", newArr)
三、深拷貝
1.JSON 方法
const obj = { a: 1, b: { c: 2 } };
const clone = JSON.parse(JSON.stringify(obj)); // 深拷貝
clone.b.c = 4
console.log("obj", obj)
console.log("clone", clone)
2.第三方庫
// Lodash
const _ = require('lodash');
const clone = _.cloneDeep(obj);