资讯专栏INFORMATION COLUMN

JavaScript栈内存和堆内存

kevin / 1704人阅读

摘要:栈内存和堆内存中的变量分为基本类型和引用类型基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问引用类型是保存在堆内存中的对象,值大小不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象,不允许直接访

栈内存和堆内存
JavaScript中的变量分为基本类型和引用类型

基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问

引用类型是保存在堆内存中的对象,值大小不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象,JavaScript不允许直接访问堆内存中的位置,因此操作对象时,实际操作对象的引用

结合代码与图来理解
let a1 = 0; // 栈内存
let a2 = "this is string" // 栈内存
let a3 = null; // 栈内存
let b = { x: 10 }; // 变量b存在于栈中,{ x: 10 }作为对象存在于堆中
let c = [1, 2, 3]; // 变量c存在于栈中,[1, 2, 3]作为对象存在于堆中

当我们要访问堆内存中的引用数据类型时

从栈中获取该对象的地址引用

再从堆内存中取得我们需要的数据

基本类型发生复制行为
let a = 20;
let b = a;
b = 30;
console.log(a); // 20

结合下面图进行理解:

在栈内存中的数据发生复制行为时,系统会自动为新的变量分配一个新值,最后这些变量都是相互独立互不影响的

引用类型发生复制行为
let a = { x: 10, y: 20 }
let b = a;
b.x = 5;
console.log(a.x); // 5

引用类型的复制,同样为新的变量b分配一个新的值,保存在栈内存中,不同的是,这个值仅仅是引用类型的一个地址指针

他们两个指向同一个值,也就是地址指针相同,在堆内存中访问到的具体对象实际上是同一个

因此改变b.x时,a.x也发生了变化,这就是引用类型的特性

结合下图理解

总结

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107855.html

相关文章

  • JS数据类型 与 内存

    摘要:所以相对于简单数据类型而言,他们占用内存比较小,如果放在堆中,查找会浪费很多时间,而把堆中的数据放入栈中也会影响栈的效率。六总结本文总结了数据类型及其声明赋值更新时在内存堆栈中的表现,可以更深入的理解这些数据类型。 JS数据类型 与 内存堆栈 一、前言 JS的数据类型已经是大家都很熟悉的东西了,但是大家是否对这些数据类型在内存中的分配了解,甚至在操作这些变量时,内存中是如何表现的,本文...

    nodejh 评论0 收藏0
  • 【js】基本类型和引用类型

    摘要:基本类型基本类型的比较就是值的比较访问是访问值本身不能定义方法和属性保存在栈内存中引用类型除了基本类型外,就是引用类型了。 基本类型 1、number2、string3、boolean4、symbol5、undefined6、null基本类型的比较就是值的比较;访问是访问值本身;不能定义方法和属性;保存在栈内存中 引用类型 JavaScript除了基本类型外,就是引用类型了。如Arra...

    Dogee 评论0 收藏0
  • 浅谈JavaScript的浅拷贝与深拷贝

    摘要:引用数据类型是存放在堆内存中的,变量实际上是一个存放在栈内存的指针,这个指针指向堆内存中的地址。栈和堆的区别其实浅拷贝和深拷贝的主要区别就是数据在内存中的存储类型不同。这里,对存在子对象的对象进行拷贝的时候,就是深拷贝了。 数据类型 在开始拷贝之前,我们从JavaScript的数据类型和内存存放地址讲起。数据类型分为基本数据类型 和引用数据类型 基本数据类型主要包括undefin...

    娣辩孩 评论0 收藏0
  • JS中函数参数值传递和引用传递

    摘要:学习中函数参数值传递和引用传递的学习中函数参数值传递和引用传递在红宝书中说到,中所有函数的参数都是按值传递的。 学习JS中函数参数值传递和引用传递的学习 JS中函数参数值传递和引用传递 在JavaScript红宝书中说到,ECMAScript中所有函数的参数都是按值传递的。理解这个概念先要从JS的堆内存和栈内存说起:栈内存为自动分配的内存空间,它由系统自动释放;堆内存则是动态分配的内存...

    ZHAO_ 评论0 收藏0
  • Java内存模型

    摘要:内存模型指定了如何与计算机内存协同工作。内部的内存模型内存模型在内部使用,将内存分为了线程栈和堆。下面的图从逻辑角度给出了内存模型每个运行在内部的线程都有自己的线程栈。部分线程栈和堆可能在某些时候会占用缓存和内部寄存器。 Java内存模型指定了JVM如何与计算机内存协同工作。JVM是整个计算机的模型因此这个模型包含了内存模型,也就是Java内存模型。 如果你像要设计正确行为的并发程序,...

    fantix 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<