谈谈 js 深浅拷贝 那点事(一)

news/2024/7/4 12:33:55 标签: 数据结构与算法

深拷贝与浅拷贝 不知道大家是咋理解的 有没有从内存空间角度去理解 前天看了一个内存空间 堆栈 下面卖弄下

在学习数据结构时候 堆栈是很熟悉了 在一端去对数据的操作

简单说 栈为自动分配内存空间 由系统自动释放
堆是动态分配的内存 大小不定也不会自动释放

  • 栈数据结构
    网上好的例子

上图很详细的说明了栈数据结构空间的存储
对于栈来说 栈的数据操作 都要在栈顶来操作

  • 堆数据结构

上面可以看到都是散落的
对于堆来说 数据项没有固定顺序 不想栈一样有顺序 在堆操作数据可以任何顺序操作 不需要必须在顶部来操作

  • js 数据类型 和堆 栈
    js中数据类型分为两类

    1. 基本类型: Undefined Null Boolean Numer String 5种基本数据类型放在栈内存中简单数据段 数据大小确定 内存空间自动分配

      var name = 'jozo'
      var city = 'gaungzhou'
      var age = 22复制代码

      上面有几个基本类型变量 在内存中结构
      内存中 包括了变量的 标识 和 值

  1. 引用类型: Object Array fun 这些引用类型 比如数组 他们的值大小是不固定的 这些放在堆内存中 js是不允许直接访问堆内存因此不能直接操作对象堆内存空间 在变量中实际上保存一个指针 这个指针指向另一个位置 实际要操作的是一个指针 不是实际对象 这个地址跟堆内存的实际值相关联

       var a = 20
       var b = 'abc'
       var c = true
       var d = { m:20 }复制代码


上图可以看到 当要访问对内存中引用类型时候 实际上从变量对象中获取这个对象地址指针 然后从堆内存中获取数据

上面js中的数据类型内存存储

  • 数据类型特性

    1. 看基本数据类型

      var a = 1
      var b = a
      b = 2   //a还是1复制代码

      基本数据类型保存在栈中 系统自动为变量分配一个值 a b 都是1 但是他们是栈中两个相互对立的东西 所以修改b 对于a来说没有影响

    2. 看引用数据类型

      var m = { a: 10, b: 20 }
      var n = m
      n.a = 15复制代码

      引用类型真正的对象保存在堆中 var m = {} 在栈中保存了一个标识跟值 根据上述说的引用类型栈中变量对象保存是一个 堆内存的指针地址
      var n = m 这里栈中自动为其分配一个空间 也是保存一个标识跟值 值也是保存的一个指针地址
      n.a = 15 改变了n的a属性 虽然栈中保存的两个相互独立东西 但是指针指向堆内存是对象是一样的 就导致了 m 也改变了

可以看到如果通过这种方式来看的话 引用类型 基本类型本质上的区别 按值 按址
下一篇拷贝实际例子
参考链接:
内存空间详细图解


http://www.niftyadmin.cn/n/842059.html

相关文章

Kafka 学习笔记之 删除Topic

删除Topic 1. 显示所有Topic信息,testTopic是我们将要删除的Topic 2. 首先确认server.properties下面配置是否已经加上delete.topic.enabletrue 3. 我们来验证是否test topic已经被真正的删除了。 a. 验证Kafka log: b. 验证Zookeeper 连接Zookeeper zkCli.sh -serv…

编码对象

要被写入和读取的对象必须继承NSObject,,并且实现NSCoding关键还要实现NSCoding 的两个必要的方法public func encode(with aCoder: NSCoder)public init?(coder aDecoder: NSCoder) 格式如下: // 编码的时候调用这个方法func encode(with aCoder: NSCo…

物联网如何跳出“看起来很美”?

摘要: 物联网市场正处在大爆发的前夜。今年2月,思科宣布14亿美元收购物联网公司Jasper,4月底Cypress宣布以5.5亿美元收购博通的无线物联网业务,其后不到一周时间,微软宣布收购意大利物联网平台Solair。 物联网市场正处…

Eclipse Maven创建项目失败的解决办法

eclipse重新配置maven环境后,无法创建项目,错误如下: 网上的解决办法一般有以下几种: 1.修改maven的配置文件,将settings文件中的默认镜像修改为国内的镜像仓库,比如阿里的镜像仓库 在mirror节点下添加 …

Eclipse Maven项目jar包Missing问题解决方法

在pom.xml文件中引入依赖后,jar包Missing,原因可能是网络太慢,jar包没下载完也可能是本地仓库位置没有配对 解决方法两种: 1.修改maven中settings配置文件中的镜像仓库 2.在项目上右键,选择maven,点Upda…

Vue使用jQuery

main.js import jquery from jquerywindow.$ window.jQuery jquery在要使用的地方直接 $即可 例如 $.ajax({type: POST,url: http://localhost:8082/User/Login,dataType: json,data: {usercode: "111",password: "222"},success: function (data) {}}…

eclipse中普通的代码自动补全和xml文件代码补全

普通补全: 打开eclipse,window->preferences->java->edtior->content assist Auto Activation下Auto activation triggers for Java中填写.abcd就Ok了 XML文件的自动补全: 在preferences中选中XML,其余操作与上面的…

JAVA面试题小总结

Volatile :Java虚拟机提供的轻量级的同步机制,基本遵守JMM规范 保证可见性: volatile int number0;此时的number的值被一个线程修改后,其他线程也可以知道修改后的值不保证原子性:线程太快会出现写覆盖,造…