浅谈JavaScript之浅拷贝和深拷贝

  1. 栈(stack)和堆(heap)
 栈为自动分配的内存空间,它由系统自动释放;而堆则是动态分配的内存,大小不定也不会自动释放。
  1. 基本类型和引用类型
  基本类型:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。

  5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,所以可以直接访问。

  引用类型:存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。

  当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。

3.语法

浅拷贝:Object.assign(target, ...sources)
深拷贝:JSON.parse(JSON.stringify(...sources))

浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来

在这里插入图片描述
4.例子

ajx的例子:
 const obj1 = {
            name: "haha",
            info: { age: 1, wrok: "码农" },
            array: [1, 2, 3],
          }
          
          /***
           * 浅拷贝 
           * 1.string int boolean不会改变原来的值(例子中 修改obj2的name obj1中name不会改变)
           * 2.对象,数组  会改变原来的值(例子中 修改obj2的age obj1中age也会改变)
           */
          const obj2 = Object.assign({}, obj1);
          obj2.name = "xixi";
          obj2.info.age = 22;
          ajx.log.print(obj1 === obj2);//false
          ajx.log.print(obj1.name === obj2.name);//false
          ajx.log.print(obj1.name);//haha
          ajx.log.print(obj2.name);//xixi
          ajx.log.print(obj1.info.age);//22
          ajx.log.print(obj2.info.age);//22
          ajx.log.print(obj1.info === obj2.info);//true
          ajx.log.print(obj1.info.age === obj2.info.age);//true
          ajx.log.print(obj1.array === obj2.array);//true
           /***
           * 深拷贝 
           */
          const obj3 = JSON.parse(JSON.stringify(obj1));
          obj3.name = "heihei";
          obj3.info.age = 24;
          ajx.log.print("aaa")//aaa
          ajx.log.print(obj1 === obj3);//false
          ajx.log.print(obj1.name === obj3.name);//false
          ajx.log.print(obj1.name);//haha
          ajx.log.print(obj3.name);//heihei
          ajx.log.print(obj1.info.age);//22
          ajx.log.print(obj3.info.age);//24
          ajx.log.print(obj1.info === obj3.info);//false
          ajx.log.print(obj1.info.age === obj3.info.age);//false
          ajx.log.print(obj1.array === obj3.array);//false
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值