• 和记娱乐官方网站

  • 和记百科

  • 娱乐

  • 体育

  • 摄影

  • 和记问答
  • 深拷贝和浅拷贝区别(深入理解深与浅的差异)

    主页 > 和记问答 > 2024-01-19 20:32

      摘要:深拷贝是指在将一个对象复制给另一个对象时,如果对象内部还含有其他对象,也将这些对象复制一份到新对象中,而不是只复制对象的指针地址。换句话说,当你对原对象进行改变时,新对象不会受到任何影响,因为它们是完全独立的。

    什么是深拷贝

     

      深拷贝是指在将一个对象复制给另一个对象时,如果对象内部还含有其他对象,也将这些对象复制一份到新对象中,而不是只复制对象的指针地址。

      换句话说,当你对原对象进行改变时,新对象不会受到任何影响,因为它们是完全独立的。

      通俗点讲,浅拷贝只是在内存中建立一个新的指针指向已经存在的堆内存,而深拷贝则在内存中建立一个新的指针,并开辟新的堆内存存储拷贝的内容。

    图片.png

      

    什么是浅拷贝

     

      浅拷贝就是指数据之间的拷贝只复制引用和地址,目标对象与原始对象会有相同的内存地址。

      换句话说,浅拷贝只是对原对象的一个简单地址引用,因此如果改变了拷贝后的对象,也会影响到原对象。

      

    深拷贝和浅拷贝的主要区别

     

      1. 新对象是与原对象一模一样的完全独立的对象,两者间毫无关联,新对象的改变不会影响到原对象的属性。

      2. 形象化地说,深拷贝就好比是“买一支全新的笔”,而浅拷贝则好比是“借用他人的笔”。

      3. 当原始对象是值类型(例如int、float、bool等)或空时,深拷贝和浅拷贝没有任何区别。

      4. 一般情况下,浅拷贝效率更高,深拷贝的效率较低。

      

    深拷贝和浅拷贝实际应用

     

      1. 对于简单的对象,使用浅拷贝即可;

      2. 如果对象间不相互嵌套,也可以放心地使用浅拷贝;

      3. 如果对象之间相互嵌套,建议使用深拷贝,否则可能会引发一些不必要的风险;

      4. 在React中,建议使用深拷贝,特别是在子组件中使用了父组件中的对象时,如果使用浅拷贝,改变子组件中的对象会直接影响到父组件中的对象;

      5. 在Vue中,由于Vue的数据响应式特性,建议尽量使用深拷贝,因为浅拷贝会造成Vue数据混乱的问题。

      

    如何实现浅拷贝

     

      1. 直接赋值,将原始对象赋值给新对象,如:let newObj = {} = oldObj;

      2. Object.assign()方法,实现将从一个或多个源对象中获取属性复制到目标对象,如:let newObj = Object.assign({}, oldObj);

      3. Spread运算符,从源对象中获取属性复制到目标对象,如:let newObj = {...oldObj};

      

    如何实现深拷贝

     

      1. Object.assign() + for-in + 递归,如:

      ```

      function deepCopy(obj) {

      let newObj = {}

      for(let key in obj) {

      if(typeof obj[key] === object){

      newObj[key] = deepCopy(obj[key])

      }else{

      newObj[key] = obj[key]

      }

      }

      return newObj

      }

      ```

      2. JSON.parse(JSON.stringify()),如:

      ```

      function deepCopy(obj) {

      return JSON.parse(JSON.stringify(obj))

      }

      ```

      注意:使用该方法,需要注意对象中不能含有函数、undefined、NaN等,因为该方法无法正确处理这些类型的数据。

      

    总结

     

      深拷贝和浅拷贝,都是非常常用的概念,也是我们在开发过程中必须掌握的基本操作。

      对于简单的对象或数据类型,我们可以直接使用浅拷贝;而对于嵌套比较深的对象结构,我们则需要使用深拷贝。

      掌握深浅拷贝的差异,对于提高代码的鲁棒性和稳定性是很重要的,希望本文能够对你有所帮助。

    上一篇:空调一级和三级有什么区别(空调能效等级一级 下一篇:汉代南海的称呼(汉代时期南海的别称是什么)

    热门阅读

    友情链接