前端必会——对象的深浅拷贝

339 阅读1分钟

前言

js中如何进行对象的深浅拷贝呢?相信看过本文后,你就会有一定的了解。话不多说,先从浅拷贝开始。


一、对象的浅拷贝?

1.什么是浅拷贝

将一个对象内的值拷贝到另一个新的对象里,但是只能拷贝最外边的一层。

2.代码演示

代码如下(示例):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      let obj = {
        uname: '张三丰',
        age: 23,
        gender: '男',
        color: ['red', 'green', 'blue'],
        message: {
          index: 3,
          score: 98
        }
      }

      let newObj = {}

      // for...in遍历进行浅拷贝
      for (let key in obj) {
        newObj[key] = obj[key]
      }

      // 可以快速实现浅拷贝的方法
      // Object.assign(newObj, obj)

      obj.uname = '阿飞'
      obj.message.index = 5

      console.log(obj, newObj)
    </script>
  </body>
</html>

3.结果展示

如下图所示,浅拷贝只能拷贝最外面一层,修改原对象中的属性,对拷贝的新对象并无影响。但是如果修改原对象中的 message对象中的内容,新对象还是会受到影响。因为原对象中的color和message属于引用数据类型,只能拷贝到其在堆内存中的地址。同理,修改原对象中color数组,新对象同样会受到影响!

在这里插入图片描述

二、深拷贝

1.为什么需要深拷贝

因为浅拷贝后,修改原对象中的引用数据类型,会影响到拷贝后的新对象。

2.代码演示

代码如下(示例):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      let a = {
        uname: '张三丰',
        age: 23,
        gender: '男',
        color: ['red', 'green', 'blue'],
        message: {
          index: 3,
          score: 98
        }
      }

      let b = {}

      // 封装一个进行深拷贝的函数,把新对象和原对象当做实参传给这个函数即可
      function deepCopyFn(newObj, obj) {
        for (let key in obj) {
          // 判断原对象内的键值对类型是否为数组
          if (obj[key] instanceof Array) {
            newObj[key] = []
            // 使用递归进行拷贝元素组内的引用类型
            deepCopyFn(newObj[key], obj[key])
          } else if (obj[key] instanceof Object) {
            newObj[key] = {}
            deepCopyFn(newObj[key], obj[key])
          } else {
            // 如果是基本数据类型,直接拷贝
            newObj[key] = obj[key]
          }
        }
      }
      // 调用函数并传入实参
      deepCopyFn(b, a)

      a.uname = '阿飞'
      a.color[2] = 'skyblue'
      a.message.index = 5

      console.log(a, b)
    </script>
  </body>
</html>

3.结果展示

如下图所示,进行深拷贝后,修改原对象内的任意数据,都不会对拷贝的新对象造成影响。 在这里插入图片描述


总结

以上就是对对象深浅拷贝的讲解了,有问题的小伙伴可以一起在评论区讨论哦~