前端开发:JS中堆和栈的区别

news2024/11/17 7:17:44

前言

在前端实际开发中,有关JS原生的堆和栈也是很重要的点,关于底层和原理的掌握使用,尤其是在性能优化方面甚为重要。众所周知,JS的变量都是存放在内存中的,而且内存给变量开辟了两块区域,即堆区域和栈区域,其实堆和栈是数据存储的一种结构。所以在实际开发中,JS中堆和栈也是比较常见且重要的知识点,而且在前端求职面试的时候二者也是常考知识点,可以说非常重要,那么本文就来做一下总结,方便查阅使用。

JS数据类型

在介绍栈和堆之前,首先再来看一下JS数据类型。前端开发者应该都知道,JS数据类型分为:基本数据类型和引用数据类型。基本数据类型其实就是保存在栈内存中的简单数据段,每种类型的数据所占用的空间大小都是确定的;引用数据类型则是保存在堆内存中的对象,每种类型的数据所占用的空间大小不确定。

1、基本数据类型

  • Number:数字类型,
  • Boolean:布尔类型,
  • String:字符串类型,
  • null,
  • undefined,
  • symbol(ES6新增的),

注意:null虽然是基本数据类型,但输出的结果是Object是因为null被认为是空的对象引用。

2、引用数据类型

  • array:数组,
  • Math:对象,
  • function:函数,
  • Date。

注意:函数不是基本数据类型,但是调用typeof后会出现function类型,那是因为函数是对象。但是也有一些特殊属性,因此利用typeof来区分函数和对象是有必要的。

具体关于JS数据类型的内容可以参看三掌柜的这篇文章,里面有详解:前端开发:JS中常用数据类型的转换以及使用场景集锦_前端2每次数据绑定时都需要转换类型吗_三掌柜666的博客-CSDN博客。

1、栈的概念

栈(stack): 栈其实是栈内存的简称,栈是由操作系统自动分配相对固定大小的内存空间,且会自动释放,存储的是基础数据类型变量以及一些对象的引用变量,占用固定大小的空间;而且栈数据结构遵循FILO(first in last out)先进后出的原则。

2、栈的代表

栈的经典代表就是:乒乓球盒结构,先放进去的乒乓球只能最后才能取出来。这里举一个简单的示例说明一下,具体如下所示:

//先来定义变量

var a = 1000;

var b = true;

var c = 'hello world';

执行的顺序如下所示

3、栈的特点

栈的特点主要是:开口向上,速度快,容量小。

1、堆的概念

堆(heap): 堆其实是堆内存的简称,堆是由操作系统动态分配的内存,且内存大小不固定,也不会自动释放,一般是由开发者分配释放内存,也可由垃圾回收机制回收内存。堆数据结构其实是一种无序堆树状结构,且满足键值对(key-value)的存储方式。而且栈数据结构遵循FIFO(First in, first out)先进先出的原则。

2、堆的代表

堆的经典代表就是:书架存书,读者根据书的名字,在书架上就可以找到对应的书。

这里举一个简单堆的示例,具体代码如下所示:

var student1 = {

name: 'John',

age: 30,

phone: '13100002222'

}

var student2 = student1;

student2.name = 'Jason';

console.log(student1.name); // 输出结果为:Jason

3、栈的特点

栈的特点主要是:速度慢,容量大。

堆和栈的区别

1、栈:基本数据类型变量是存储在栈中的,而引用数据类型变量存储在栈中的是指向堆中的数组或者对象的地址,这就是为什么修改引用数据类型总是会影响到其他指向这个地址的引用变量。

栈的优点:

(1)栈中的内容是由操作系统自动创建、自动回收的,占用固定大小的内存空间,所以内存可以及时得到回收,相对于堆来说更容易管理内存空间;

(2)与堆相比存取速度更快,且栈内存中的数据是可以共享的。

栈的缺点:

存在栈中的数据大小与生存的周期必须是确定的,缺乏灵活性。

2、堆:堆内存中的对象不会因为方法的结束而销毁,即便方法结束,该对象也可能会被其他引用变量所引用,是因为参数间传递的原因。创建对象是为了反复利用,该对象将被保存到运行时数据区,即堆内存。只有当一个对象没有任何引用数据类型变量引用它的时候,系统的垃圾回收机制才会在核实时回收它。

堆的优点:

(1) 堆是由操作系统动态分配的、大小不定的内存,所以比较方便存储和开辟内存空间;

(2)堆中保存的对象不会自动释放,一般由开发者分配释放,也可由垃圾回收机制回收,所以生存周期比较灵活。

堆的缺点:

存在堆中的数据大小与生存周期是不确定的,比较混乱,杂乱无章,容易混淆。

3、小结

(1)JS的数据类型中,基本数据类型存在栈中,引用数据类型存在堆中;

(2)基本数据类型有固定的大小和值,存放在栈中;引用类型不固定大小,但其引用地址是固定的,它的地址存在栈中,指向存储在堆中的对象里面;

(3)基本数据类型在当前环境执行结束时自动销毁;引用类型只有在引用的它的变量不存在的时候,会被垃圾回收机制回收;

(4)基本数据类型是深拷贝,引用数据类型是浅拷贝,变量的复制其实是引用的传递;

(5)基本数据类型不可添加属性和方法,但引用数据类型可以添加属性和方法;

(6)基本数据类型在做比较相等的时候,可以直接用 == 或者 ===来做比较;但引用类型,即便let s = {}; 和let s1 = {}; 一样,但它们的内存地址不一样,所以做比较的结果依然不相等。

(7) 传值和传址:从一个变量向另一个变量复制引用数据类型的值,其实复制的是指针,因此两个变量最终指向同一个对象,即复制的是栈中的地址而不是堆中的对象。从一个变量复向另一个变量复制基本类型的值,会创建这个值的副本。

堆和栈的溢出

堆和栈的溢出,具体如下所示:

(1)若想要堆溢出,可以循环创建的对象或者外层的对象;

(2)若想要栈溢出,可以递归调用方法,随着栈深度的增加,虚拟机(JVM)会维持着一条很长的方法调用轨迹,直至内存不够分配为止,产生栈的溢出。

最后

通过本文关于前端开发中关于JS中堆和栈的区别的详细介绍,堆和栈的区别及其使用不管是在实际的前端开发工作中还是在前端求职面试中都是非常关键的知识点,所以作为前端开发者来说必须要掌握它相关的内容,尤其是从事前端开发不久的开发者来说尤为重要,是一篇值得阅读的文章,重要性就不在赘述。欢迎关注,一起交流,共同进步。

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

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

相关文章

头条_signature

文章目录 0x0目标url0x1接口分析0x2定位0x3调试分析0x4扣代码,补环境0x5运行测试0x6相关代码 0x0目标url aHR0cHM6Ly93d3cudG91dGlhby5jb20 0x1接口分析 打开开发者工具,在xhr下可以找到相关接口 _signature由js算法生成 0x2定位 这里通过全局搜索的…

lesson 12 Zigbee绑定通信

目录 Zigbee绑定通信 通信原理 实验过程 实现步骤 实验现象 实验分析 Zigbee绑定通信 通信原理 1、Zigbee一共有五种通信方式:单播、广播、组播、MAC、广播 2、绑定是Zigbee的一种基本通信方式,具体绑定通信又分为三种模式,模式大同…

C++之std::move用法(一百四十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

最长回文串

Manacher 问题 寻找字符串中的最长回文串 传统做法 字符串首字符前加一个特殊字符 ‘#’ 末尾字符加一个特殊字符 ‘#’ 相邻字符间也加上特殊字符 ‘#’ 遍历字符串,除特殊字符外,以每个字符作为回文字符串的中心向外扩张 思考 很明显这种做法的…

吴恩达ChatGPT《LangChain for LLM Application Development》笔记

基于 LangChain 的 LLM 应用开发 1. 介绍 现在,使用 Prompt 可以快速开发一个应用程序,但是一个应用程序可能需要多次写Prompt,并对 LLM 的输出结果进行解析。因此,需要编写很多胶水代码。 Harrison Chase 创建的 LangChain 框…

基于Mybatis的数据权限拦截器实现

目录 一、背景二、动机三、实现思路3.1 权限类型、操作类型3.2 统一用户及数据权限集合模型3.3 定义数据权限拦截注解3.4 提取配置属性3.5 数据权限拦截器实现 四、集成方式五、关于D3S 一、背景 最近一直在做RBAC相关的架构设计与实现,传统的RBAC的权限控制只是控…

2023CCF CAT- 全国算法精英大赛

目录 A Flower B Tree C Best Travel Plans D Hearthstone E Hotpot F Mystery Sailing Challenge G Card H The diameter of a rectangle I Tourist J Mysterious Rune String A Flower B Tree C Best Travel Plans D Hearthstone E Hotpot F Mystery Sailing Challe…

Git标签管理

目录 标签介绍 创建标签 删除标签 推送标签到远程仓库 标签介绍 标签tag,可以理解为是对某次commit 的一个标识,相当于起了一个别名。 比如说有些重要的commit id 难以记住,这时候就可以利用tag给这个commit id 起一个有意义的名字&…

【QT】图形化页面设计

可视化的图形化界面共有三种设计方式,一种是通过可视化来设计界面的方式;一种是代码化的设计方式;最后是混合上面两种的混合界面设计方式。目前我们只考虑通过Designer和代码来设计图形化页面的两种方式。 目录 可视化图形界面设计 图形页…

数字信号的载波传输

从信号传输质量来看,数字系统优于模拟系统。 由于数字基带信号的频谱包含低频成分,而许多重要的通信信道是带通型的,比如无线信道和许多有线信道,这时需要调制成数字频带信号。 数字调制与模拟调制原理基本相似,有调幅…

ChatGLM-6B详细学习实践记录与资料分享

随着年初chatGPT产品的退出和迭代发展,凭借一己之力将大模型带火,国产很多厂商后续也陆续跟进开始投入研发属于自己的大模型产品,在这段时间里面陆陆续续出来了很多不同的产品,比如:文心一言、星火大模型、通义千问、商…

吴恩达AIGC《How Diffusion Models Work》笔记

1. Introduction Midjourney,Stable Diffusion,DALL-E等产品能够仅通过Prompt就能够生成图像。本课程将介绍这些应用背后算法的原理。 课程地址:https://learn.deeplearning.ai/diffusion-models/ 2. Intuition 本小节将介绍扩散模型的基础…

gof23设计模式之代理模型

1. 代理模式 1.1. 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代…

Kubernetes对象深入学习之一:概览

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于《Kubernetes对象深入学习》系列 在client-go的学习和使用过程中,不可避免涉及到对象相关的代码,经常面临一个尴尬的现象&#x…

PCL点云处理之多角度剖面切割(一百九十五)

PCL点云处理之多角度切割点云剖面(一百九十五) 一、算法介绍二、具体实现1.沿法向量方向切割剖面2.沿竖直方向切割剖面3.沿水平方向切割剖面一、算法介绍 点云的剖面往往隐藏着很多有用信息,而且分析更加简单一些,这里自己实现一系列不同角度的点云剖面切割,包括沿着法向量…

车载软件架构 —— 闲聊几句AUTOSAR OS(七)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

Framework - AMS

一、概念 Android10(API29)开始,ActivityTaskManagerService 接管 ActivityManagerService。 二、启动ATMS过程 三、启动APP & 跳转Activity过程 3.1 Activity → ATMS 启动一个 APP 或跳转一个 Activity 都是调用的 startActivity()&a…

数据结构--串的存储结构

数据结构–串的存储结构 串的顺序存储 静态数组实现(定长顺序存储) #define MAXLEN 255 typedef struct {char ch[MAXLEN];int length; }SString;动态数组实现(堆分配存储) typedef struct {char* ch;int length; }HString;int main() {HString S;S.ch (char*)malloc(sizeo…

问题解决:centos7异常关闭后无法开机

前言:主机卡死,直接关了电脑电源,虚拟机中的centos7 产生错误,无法开机 重点是取消挂载。很多文章都提到了xfs_repair /dev/dm-0 , 但是不适用我遇到的情况。 # ls /dev/mapper umount /dev/mapper/centos-root xfs_repair -v -…

[洛谷]B3601 [图论与代数结构 201] 最短路问题_1(负权)(spfa)

SPFA模板啦~ 直接上ACcode: #include<bits/stdc.h> using namespace std; //#define int long long #define inf 2147483647 const int N15e310,M2*N; int dis[N],head[N],cnt; bool vis[N]; int n,m; struct E {int to,w,next; } e[M]; queue<int>q; void add(in…