JS深拷贝和浅拷贝

浅拷贝(Shallow Copy):

浅拷贝只复制对象的第一层属性,如果对象的属性是引用类型(比如数组、对象),则只会复制引用而不是实际的值。常见的浅拷贝方法包括Object.assign()和展开运算符...

  1. Object.assign():

    1
    2
    const original = { a: 1, b: { c: 2 } };
    const shallowCopy = Object.assign({}, original);
  2. 展开运算符(…):

    1
    2
    const original = { a: 1, b: { c: 2 } };
    const shallowCopy = { ...original };
  3. Array.slice():

    对于数组,使用slice()方法也可以实现浅拷贝。

    1
    2
    const originalArray = [1, 2, 3];
    const shallowCopyArray = originalArray.slice();
  4. Array.concat():

    另一个数组的浅拷贝方法是使用concat()方法。

    1
    2
    const originalArray = [1, 2, 3];
    const shallowCopyArray = originalArray.concat();

深拷贝(Deep Copy):

深拷贝会递归地复制所有层级的对象属性,确保新对象的每个值都是原始对象值的副本,而不是对同一引用的引用。

  1. JSON.parse() 和 JSON.stringify():

    使用JSON.parse()JSON.stringify()结合可以实现简单的深拷贝,但无法处理循环引用以及特殊对象。

    1
    2
    const original = { a: 1, b: { c: 2 } };
    const deepCopy = JSON.parse(JSON.stringify(original));
  2. 使用第三方库

    第三方库如 Lodash 提供了更完善和高效的深拷贝方法。

    1
    2
    3
    const _ = require("lodash");
    const original = { a: 1, b: { c: 2 } };
    const deepCopy = _.cloneDeep(original);
  3. 自定义递归函数

    可以编写自定义递归函数来处理深拷贝,能够更灵活地控制拷贝过程。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function deepCopy(obj) {
    if (typeof obj !== "object" || obj === null) {
    return obj;
    }
    const newObj = Array.isArray(obj) ? [] : {};
    for (let key in obj) {
    newObj[key] = deepCopy(obj[key]);
    }
    return newObj;
    }

选择深拷贝还是浅拷贝取决于具体的需求。在处理简单的数据结构时,浅拷贝通常足够;但在需要完全独立的副本、或者处理复杂嵌套对象时,则需要深拷贝。不同的场景可能需要使用不同的拷贝方式。