深浅拷贝的区别,如何实现深拷贝和浅拷贝

125 阅读2分钟

JavaScript基础

深浅拷贝的区别,如何实现深拷贝和浅拷贝

首先深浅拷贝是适用于对象的。

深拷贝是指在复制对象时,创建一个新的对象,并将原对象的所有属性和子对象都复制到新对象中,新对象与原对象完全独立,对新对象的修改不会影响原对象。

浅拷贝是指在复制对象时,只复制对象本身的属性,而不复制其子对象,新对象与原对象共享同一子对象,对新对象的修改会影响原对象。 也就是说 我们从浅拷贝中如果对更改属性出来的obj,不会对原对象进行干扰,但是对象内的对象则会进行干扰

举个例子: 假设有一个对象A,包含属性a和子对象B。

  1. 深拷贝: 深拷贝对象A时,会创建一个新的对象A',并将属性a的值和子对象B完全复制到A'中,A'与A是完全独立的两个对象,对A'的修改不会影响A。
  2. 浅拷贝: 浅拷贝对象A时,会创建一个新的对象A',并将属性a的值复制到A'中,但子对象B只是引用了原对象A中的子对象B,并没有真正复制,所以A'与A共享同一子对象B,对A'的修改会影响A。

浅拷贝举例

    const obj = {
      uname: 'person',
      age: 18,
      family: {
        baby: 'son'
      }
    }
     //通过展开运算符对obj进行浅拷贝
     const o = { ...obj }
     console.log(o)
     o.age = 20
     console.log(o)
     console.log(obj)
     
    //通过Object.assign来进行浅拷贝
    const o = {}
    Object.assign(o, obj)
    o.age = 20
    o.family.baby = 'sony'
    console.log(o)
    console.log(obj)

深拷贝的具体实现方式

1.通过递归函数进行深拷贝

2.通过lodash包进行深拷贝

3.通过JSON.String ,JSON.parse 进行JSON格式转换进行深拷贝

1通过递归函数进行深拷贝

function deepClone(obj) {
    if (typeof obj !== 'object') return;

    let newObj = obj instanceof Array ? [] : {};

    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key];
        }
    }

    return newObj;


通过lodash进行深拷贝

const _ = require('lodash');

const obj = {
  a: 1,
  b: { c: 2 },
};
const deepCloneObj = _.cloneDeep(obj);

使用JSON.parse()和JSON.stringify()实现深拷贝


function deepClone(obj) {
    return JSON.parse(JSON.stringify(obj));
}