深拷贝与浅拷贝的理解及实现

深拷贝与浅拷贝

简单点:

b拷贝a,修改a,此时a发生变化,若b也跟着发生变化(脱离不了a的摆布),则为浅拷贝。若b不发生变化,能脱离a的摆布则为深拷贝。**

主要从基本数据类型和引用数据类型的概念说:

基本数据类型:number,string,boolean,null,undefined五类。

引用数据类型(Object类)有:对象{a:1},数组[1,2,3],以及函数等。

1、基本数据类型—名、值储存在栈内存中:例 let a =1

在这里插入图片描述
深拷贝:当你b=a复制时,栈内存会新开辟一个内存,例如这样:
在这里插入图片描述
浅显理解: let a = 1; let b = a ; 此时修改a=0;b不会发生变化。

真正意义上这不是深拷贝,因为深拷贝本身只针对较为复杂的object类型数据。

2、B.引用数据类型-- 名字存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值,例如:
在这里插入图片描述
浅拷贝: 当b=a进行拷贝时,其实b复制的只是a的引用地址,而并非堆里面值。例:在这里插入图片描述
理解:此时我们去修改a的值,b同时也发生了变化,则为浅拷贝。

实现拷贝的方法

1、通过js的json实现
例:

<script>
 var obj = {
     
     
        name: '小甜甜',
        age: 24,
        say() {
     
     
          console.log(11)
        },
      }
       var obj1 = JSON.stringify(obj)
       obj1 = JSON.parse(obj1)
       console.log(obj1)
 </script>

2、通过for in 遍历实现
例:

 <script>
   var obj = {
     
     
        name: '小甜甜',
        age: 24,
        say() {
     
     
          console.log(11)
        },
      }
 var obj1 = {
     
     }
    for (var attr in obj) {
     
     
      obj1[attr] = obj[attr]
       }
      console.log(obj1)
      // 修改obj1
      obj1.name = 'sx'
      // 打印obj 不发生变化
      console.log(obj)
</script>

3、使用Object.assign()方法
例:

 <script>
  var obj = {
     
     
        name: '小甜甜',
        age: 24,
        say() {
     
     
          console.log(11)
        },
 var obj1 = {
     
     }
      Object.assign(obj1, obj)
      // 此处将两个对象合并
       console.log(obj1)
 </script>

4、 …(三个点)语法
例:

  <script>
    var obj = {
     
     
        name: 'sx',
        age: 18,
      }
       var obj1 = {
     
      ...obj }
       // 修改obj的属性name
      obj.name = 'ls'
      //打印
      console.log(obj, obj1)
    </script>

猜你喜欢

转载自blog.csdn.net/weixin_49840493/article/details/109125035