首页 > 编程语言 >JavaScript 中栈与堆的区别

JavaScript 中栈与堆的区别

时间:2023-12-12 21:04:29浏览次数:40  
标签:变量 区别 JavaScript 数据类型 中栈 存放 引用 类型

每种编程语言都具有内建的数据类型,但它们的数据类型常有不同之处,使用方式也很不一样,比如 C 语言在定义变量之前,就需要确定变量的类型。在声明变量之前需要先定义变量类型。我们把这种在使用之前就需要确认其变量数据类型的称为静态语言。

相反地,我们把在运行过程中需要检查数据类型的语言称为动态语言。比如 JavaScript 就是动态语言,因为在声明变量之前并不需要确认其数据类型。

对于各种语言的类型:

JavaScript 中栈与堆的区别_JavaScript

JavaScript 是一种弱类型的、动态的语言。

  • 弱类型,意味着你不需要告诉 JavaScript 引擎这个或那个变量是什么数据类型,JavaScript 引擎在运行代码的时候自己会计算出来。
  • 动态,意味着你可以使用同一个变量保存不同类型的数据。

在 JavaScript 中,如果你想要查看一个变量到底是什么类型,可以使用“typeof”运算符。其实 JavaScript 中的数据类型一种有 8 种,它们分别是:

JavaScript 中栈与堆的区别_JavaScript_02

第一点,使用 typeof 检测 Null 类型时,返回的是 Object。这是当初 JavaScript 语言的一个 Bug,一直保留至今,之所以一直没修改过来,主要是为了兼容老的代码。

第二点,Object 类型比较特殊,它是由上述 7 种类型组成的一个包含了 key-value 对的数据类型。Object 是由 key-value 组成的,其中的 vaule 可以是任何类型,包括函数,这也就意味着你可以通过 Object 来存储函数,Object 中的函数又称为方法。

第三点,前面的 7 种数据类型称为原始类型,把最后一个对象类型称为引用类型,之所以把它们区分为两种不同的类型,是因为它们在内存中存放的位置不一样。

 在 JavaScript 的执行过程中, 主要有三种类型内存空间,分别是代码空间、栈空间和堆空间。其中的代码空间主要是存储可执行代码的。栈空间是用来存储执行上下文的。

对象类型是存放在堆空间的,在栈空间中只是保留了对象的引用地址,当 JavaScript 需要访问该数据的时候,是通过栈中的引用地址来访问的,相当于多了一道转手流程。

为什么一定要分“堆”和“栈”两个存储空间呢?所有数据直接存放在“栈”中不就可以了吗?因为 JavaScript 引擎需要用栈来维护程序执行期间上下文的状态,如果栈空间大了话,所有的数据都存放在栈空间里面,那么会影响到上下文切换的效率,进而又影响到整个程序的执行效率。

JavaScript 中栈与堆的区别_JavaScript_03

通常情况下,栈空间都不会设置太大,主要用来存放一些原始类型的小数据。而引用类型的数据占用的空间都比较大,所以这一类数据会被存放到堆中,堆空间很大,能存放很多大的数据,不过缺点是分配内存和回收内存都会占用一定的时间。

在 JavaScript 中,赋值操作和其他语言有很大的不同,原始类型的赋值会完整复制变量值,而引用类型的赋值是复制引用地址。

产生闭包的核心有两步:第一步是需要预扫描内部函数;第二步是把内部函数引用的外部变量保存到堆中。

原始类型的数据是存放在栈中,引用类型的数据是存放在堆中的。堆中的数据是通过引用和变量关联起来的。也就是说,JavaScript 的变量是没有数据类型的,值才有数据类型,变量可以随时持有任何类型的数据。


标签:变量,区别,JavaScript,数据类型,中栈,存放,引用,类型
From: https://blog.51cto.com/key3feng/8790550

相关文章

  • 深入浅出Thread.currentThread()与this的区别
    Thread.currentThread()与this的意义Thread.currentThread()可以获取当前线程的引用this可以理解为调用当前方法的对象的引用初步分析代码如下,生成一个线程,并且启动线程。publicclassMain{publicstaticvoidmain(String[]args){Pointpoint=ne......
  • TCP和UDP的区别
    TCPTCP(TransmissionControlProtocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立,其中的过程非常复杂,过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同......
  • 400和404的区别
    400错误和404错误都是HTTP状态码,用于表示Web服务器在处理HTTP请求时的响应状态。它们之间的主要区别在于所指示的问题类型和含义。400错误(HTTP400BadRequest):400错误表示客户端发送的请求有语法错误,服务器无法理解或无法处理。这通常是因为请求的语法不正确或参数无效。当服务器......
  • Python中json.load()和json.loads()的区别
    一、图解json.loads():解析一个有效的JSON字符串并将其转换为Python字典json.load():从一个文件读取JSON类型的数据,然后转转换成Python字典二、json.loads()用法1、例子importjsondata={"name":"Satyamkumar","place":"patna","skills":["Raspber......
  • 高并发情况下的漏桶算法(javascript版)
    classLeakyBucket{//高并发情况下的漏桶算法 constructor(capacity,leakRate){//创建一个容量为capacity,每秒漏水量为leakRate的漏桶 this.capacity=capacity; this.leakRate=leakRate; this.water=0; this.lastLeakTime=Date.now(); ......
  • 程序处理中 Exceptions 和 Messages 的区别和各自的使用场合
    在计算机软件工程中,异常处理(exceptions)和消息传递(messages)是两种常见的处理错误情况的方式。它们各自有着不同的特点和适用场合,下面将对它们进行详细介绍,并通过实例来说明它们的应用。异常处理(exceptions):异常处理是一种在程序执行过程中,出现错误时跳出正常流程,进入专门的错误处理流......
  • 关系和非关系型数据库区别
    数据库分类关系型数据库:(SQL)MySQL,Oracle,SqlServer,DB2,SQLlite通过表和表之间,行和列之间的关系进行数据的存储,学员信息表,考勤表,,,非关系型数据库:(NOSQL)Redis,MongDB非关系型数据库,对象存储,通过对象自身的属性来决定DBMS(数据库管理系统)需要数据库的管理软件,科学有效的管理我们的......
  • MySAM和InnoDB的区别
    关于数据库引擎innodb 默认使用myisam 早些年使用的myisam和innodb区别 MYISAM INNODB事务支持 不支持 支持数据行锁定 不支持 支持外键约束 不支持 支持全文索引 支持 不支持表空间的大小 较小 较大,约为MYISAM的两倍常规使用操作:MYISAM 节约空间,速度较快INNODB 安全性......
  • 简单理解批处理和流处理的区别
    批处理和流处理是两种不同的数据处理方法,它们在数据处理的时机、方式和适用场景上有所区别。批处理(BatchProcessing):数据处理时机:批处理通常在数据积累到一定量之后进行。这意味着数据会被存储起来,直到有足够的数据量或者达到预定的处理时间点,然后一次性处理。数据处理方式:在......
  • 在Arduino环境下对ESP32进行寄存器操作和区别比较
    在Arduino环境下对ESP32进行寄存器操作和区别比较前言这篇文章主要是对在Arduino环境下如何对ESP32进行寄存器操作进行了相关的说明。并且比较了在不同编程方式下GPIO口的电平翻转速度,这可以更加直观的不同编程方式下的代码运行效率。(平台是VScode,使用Platformio下的Arduino固......