JS高级类型存储方式——含堆/栈分析

news2024/9/20 22:58:59

1、内存

  • 在编写正式内容前,首先需要弄清楚的一个概念就是:内存
  1. 内存 :也就是电脑中的硬件内存越大,可以同时开启的程序就越多
  2. 内存的作用
    • 存储运行中的代码,把代码执行过程中所需要的数据,都放在内存中,进行临时的存储
    • 程序关闭时,在从内存中取出这些数据,所有的变量在程序运行的过程中都是放在内存中进行存储的

2、堆/栈概念

2.1、栈

  • 概念:
    • 是一种数据结构,遵循后进先出(LIFO,Last In First Out)的原则。
    • 也就是:最先入栈的数据最后出栈,而最后入栈的数据最先出栈。
  • 栈中的数据结构
    • 中,通常存储函数调用时的局部变量、参数和返回地址
    • 中的每个元素可能包括变量实际值对象的引用地址

2.2、堆

  • 概念:
    • 是一种用于动态分配内存内存区域
    • 程序运行时,可以在中申请所需的内存,并在使用完毕后手动释放。
  • 堆中的数据结构
    • 栈中的指针:保存指向堆中数据的内存地址。
    • 堆中的值:实际存储在堆中的数据,如对象的属性或数组的元素。

2.3、注意

  1. 我们在存储高级类型变量中,存储的并不是高级类型的值,而是高级类型的地址
    • 比如:在里存储了arr数组,那么跟它一起存放的并不是对应的数据,而是对应数据存储的地址
    • 这个地址的对应的位置是,把数据放在了里,并给它取一个"名字"也就是地址,方便获取地址
  2. 堆/栈的存储模型不是一样的

3、高级类型存储的特征

// 示例1:
          var arr1 = [];
          var arr2 = [];
    // 1)比对时,结果为false
    // 2)因为在栈里的变量,存的是地址,而不是它的值,此时比较的是两个数组的存储地址,地址当然是不一样的,所以是false
          console.log( arr1 === arr2 ); 

// 示例2:共用地址 => 高级类型可以多个变量共用一个地址:创建1个数组,好多个变量都用这个数组的地址
      var arr3 = []; 
    // 1)arr3和arr4共用一个数组的地址,但这种操作其实并不好,会产生一些意外的结构,此时操作arr4地址对应的数组,arr3查看的是同样的数组
      var arr4 = arr3;  
    // 2)再后方添加数据
      arr4[arr4.length] = "hello world"; 
    // 3)输出成功,arr3里也增加了"hello world"
      console.log( arr3 ); 
    // 4)注意:
        // 同级别尽量规避这样的同地址变量使用,只在作用域不同的情况下使用这种地址赋值
        // 比如上面的示例,可以直接访问arr3,就没什么必要额外再去增加一个变量arr4,再进行操作

// 示例3:特殊情况共用地址
      function push( arr , data ){  
    // 1)通过push函数向数组最后面添加了一条数据
           return arr[ arr.length ] = data; 
      }
        var arr5 = []; 
    // 2)在调用函数时,实参必须是数据,如果实参位置是变量则表示变量访问 => 此时的arr5就是数组的地址,"hello world5"就是对应的data
        push( arr5 , "hello world5" ); 
        console.log( arr5 );
                             
        var arr6 = [];
    // 3)这里同上
        push( arr6 , "你好世界") 
        console.log( arr6 );
    // 4)解释:通过调用push函数可以给当前数组的最后位置添加一条数据,这里使用了共用地址

4、补充示例

// 1、修改obj2中的name会影响到obj1,且obj1赋值给obj2时打印两者是否相等 => true
// 解释: 
      // 1)因为:obj1被赋值给了obj2 => 其实是把obj1的地址复制给了obj2,那么当obj2修改数据的时候,会访问到obj1内容的"本尊",则修改数据时,会导致obj1也被修改
      // 2)通俗点解释就是:去酒店住宿,同一间房给了两张房卡,使用a卡进去后,拿出来一件东西,在使用b卡进去时,东西是必然少了的
      var obj1 = {
        name : "吴彦祖",
        age : 18,
        location : "北京"
      }
      var obj2 = obj1
      console.log(obj1 === obj2); // true
      obj2.name = "刘德华"
      console.log(obj1,obj2); // 数据相等

// 2、两个一模一样的对象,对比结果是不相等的
// 解释:
      // 虽然看着一模一样,但是两个对象的地址是不一样的,obj3在堆里存放完数据后给栈里的返回的是1个地址,而obj4存放完后再返回的则是另外一个地址了
     var obj3 = {name : "刘亦菲"}; 
     var obj4 = {name : "刘亦菲"};
     console.log(obj3 === obj4); // false

// 3、正确复制对象的方法
   // 1)声明空对象
     var obj5 = {} 
     var obj6 = {
         name : "张韶涵",
         age : 22,
         location : "北京"
     };  
   // 2)遍历obj6中的每一项数据
     for(var i in obj6){  // 
   // 3)取出obj6中每项数据后,再复制给obj5 => 此时两个对象的存储地址就不一样了,和直接复制是不同的,这里是一个对象一个地址,不存在一个房间两张房卡的情况              
        obj5[i] = obj6[i] 
     }
  // 4)修改添加后的name值
     obj5.name = "迪丽热巴" 
  // 5)可以正确修改,不会影响obj6的数据
     console.log(obj5,obj6);
</script>

5、堆/栈简易示例图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon20.11深度学习目标检测模型

1.前言&#xff1a;.Halcon的深度学习标注工具一直在更新&#xff0c;我下载的20.11版本的Deep Learning Tool已经显示过期&#xff0c;无奈只能下载最新版MVTec Deep Learning Tool 24.05。不过最新版的标注工具做的很人性化&#xff0c;分类&#xff0c;目标检测&#xff0c;…

化挑战为机遇,联想凌拓迎来杨旭时代

【全球存储观察 &#xff5c; 科技热点关注】 2024年7月&#xff0c;联想凌拓CEO杨旭上任&#xff0c;引发业界广泛关注&#xff0c;成为国内数据存储领域的新闻焦点。 现在&#xff0c;联想凌拓迎来了杨旭时代。作为联想凌拓CEO&#xff0c;杨旭的到任给联想凌拓带来了怎样的…

又有不少人要为《黑神话:悟空》买电脑了

1. 什么是 3A 游戏&#xff1f;2. 《黑神话:悟空》是一款怎样的游戏&#xff1f;3. 又有不少人要为《黑神话:悟空》买电脑了 3.1. 《黑神话:悟空》对电脑性能的要求3.2. 性能测试工具 不管你是游戏玩家还是非游戏玩家&#xff0c;这两天肯定被“黑悟空”刷屏了。 因为就在昨…

爆赞!斯坦福大学力作《深度学习漫画书》,翻烂它都不为过!

“斯坦福大学深度学习漫画书”是一本以漫画形式介绍深度学习基础知识的书籍&#xff0c;作者是Andrew Ng。 这本书以漫画形式切入&#xff0c;将一图胜千言的道理玩到了极致&#xff01;并通过生动有趣的漫画形式来深入了解深度学习的概念和应用&#xff0c;把复杂的深度学习技…

【本社翻译】Unity官方XR开发电子书

上个月&#xff08;2024年7月&#xff09;&#xff0c;Unity 官方发布了一本聚焦 XR 开发的电子书&#xff0c;书名为《Create Virtual and Mixed Reality Experiences in Unity》。本书系统介绍了以 XR Interaction Toolkit 为代表的一系列 Unity XR 开发工具集&#xff0c;深…

基于JavaEE的远程医疗管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

有源音箱申请Hi-Res认证指南

有源音箱&#xff08;也称为主动式音箱&#xff09;是一种内置功率放大器的音箱&#xff0c;其显著特点是音箱内部含有一套功率放大电路&#xff0c;可以直接通过音频线&#xff08;如RCA线、3.5mm音频线或莲花线&#xff09;与信号源&#xff08;如电视、电脑、DVD播放器等&am…

LLM+Agent+多模态:大模型全栈入门、从0到企业落地、前沿论文,一定要看看!(全攻略保姆教程)

现在搞AI科研&#xff0c;基本上都离不开大模型。不管是“水”篇论文还是冲顶会&#xff0c;结合LLM的创新点都非常多。 但是LLM相关的内容很多&#xff0c;学校的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学&#xff0c;学习成本和门槛很高。 针对所有自学遇到…

使用yolov5实现目标检测和yolov8实现分割简单案例

一、前置 测试这个案例之前需要安装一些前置的东西&#xff0c;如果已经安装的可以忽略&#xff0c;下面我给出我跟着做的一些很好的博客提供大家参考&#xff0c;因为我们主要目的还是实现yolov5的目标检测。 1、安装nvidia显卡驱动 可以参考&#xff1a;【Windows】安装NV…

黑夜力作-Web爬虫入门与实战精讲-专栏导读

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年CSDN全站百大博主。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&am…

高性能minio集群环境搭建(配视频教程)

为后续进行《小卷原创视频教程&#xff1a;spring boot 3 vue3文件上传最佳实践》的大文件上传项目实战&#xff0c;这里带着小伙伴一起搭建下分布式开源文件存储minIO的集群环境。后续将对这个环境进行spring boot的集成&#xff0c;以进行企业级大文件上传的对接。 文章目录…

分布式基础理论——CAP理论和BASE理论

文章目录 CAP 理论BASE 理论参考资料 CAP 理论 CAP定理&#xff08;CAP theorem&#xff09;指出&#xff0c;在分布式系统中&#xff0c;设计读写操作时只能同时满足以下三个特性中的两个&#xff1a; 一致性&#xff08;Consistency&#xff09; : 所有节点访问同一份最新的…

Leetcode每日刷题之3.无重复字符的最长子串(C++)

1.题目解析 本题的目标是在给定的字符串中找出不含有重复字符的最长子串&#xff0c;并且返回其长度&#xff0c;这道题核心就是如何去重并且不能遗漏以保证子串长度最长&#xff0c;题目来源:3.无重复字符的最长子串 2.算法原理 本题的算法原理主要是"滑动窗口"也就…

做数据采集,你真的了解PLC插槽号吗?

有很多PLC可以在系统里配置多个独立CPU&#xff0c;各自有自己的任务。也有一些PLC&#xff0c;虽然只有一个CPU&#xff0c;但是&#xff0c;其位置是可变的。外部进行数据采集时&#xff0c;首先要搞明白采集目标是哪个CPU&#xff0c;否则&#xff0c;就会张冠李戴&#xff…

[大模型]Milvus Lite安装

文章目录 前提相关链接官方网站中文网站 创建虚拟环境安装Milvus连接Milvusattu连接工具attu官方开源地址下载地址连接 Milvus 是一款开源的向量数据库&#xff0c;它主要特点是高可用、高性能和易扩展&#xff0c;主要用于处理海量向量数据的实时召回。它基于诸如 FAISS、Anno…

nginx和tomcat负载均衡,动静分离

文章目录 一&#xff0c;tomcat1.tomca用途2.tomcat重要目录 二&#xff0c;nginx1.Nginx应用2.nginx作用3.nginx的正向代理和反向代理3.1正向代理3.2反向代理(单级)3.3反向代理(多级) 4.nginx负载均衡4.1Nginx支持的常见的分流算法1. 轮询(Round Robin):2.最少连接数(LeastCon…

【日记】黑神话的优化感觉有些微妙(1188 字)

正文 今天省分行一把手来我们县里。很奇怪。一整天都在为迎接他做准备。中午也没有什么午休&#xff0c;全员到工位上值班值守。 就算如此我还是抽了一点所剩无几的时间&#xff0c;体验了一下黑神话。 上午 10 点钟&#xff0c;远程控制电脑开始解压昨天的预载。大概解压了一个…

120KW可编程液冷负载优势和特点

120KW可编程液冷负载是一种先进的电力设备&#xff0c;它采用液冷技术进行冷却&#xff0c;具有高效、稳定、安全等特点。以下是其优势和特点的详细介绍&#xff1a; 1. 高效冷却&#xff1a;液冷负载采用液冷技术进行冷却&#xff0c;能够更有效地将热量传导出去&#xff0c;提…

基于vue3的模拟数据mock.js应用

一、mock.js介绍 Mock.js 是一个用于生成随机数据&#xff0c;拦截 Ajax 请求的 JavaScript 库。它主要用于前后端分离开发时&#xff0c;模拟后端数据接口&#xff0c;使得前端开发者在不需要后端实际编写接口的情况下&#xff0c;也能进行开发、测试。 1、主要功能 生成随…

统一认证及单点登录(SSO)技术探讨

在当今复杂的企业环境中&#xff0c;用户身份管理和访问控制变得越来越重要。随着企业应用系统的增多&#xff0c;如何高效地管理用户身份和简化用户登录流程成为了一个亟待解决的问题。统一认证和单点登录&#xff08;SSO&#xff09;技术应运而生&#xff0c;为企业提供了一种…