javascript堆和栈

javascript变量类型分为基本类型和引用类型

栈 stack”和“堆 heap”

简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。stack一般是静态分配内存,heap上一般是动态分配内存

栈内存

栈内存在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,js就在栈中为这个变量分配内存空间,当超过变量的作用域后,js会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用

基本类型

基本类型有 Undefined、Null、Boolean、Number 和String
这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间 它们是直接按值存放的,所以可以直接访问

引用类型

引用类型,值的大小不固定,栈内存中存放地址指向堆内存中的对象。变量中实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。
当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。

传值和传址

举例
let a=[1,2,3,4,5]
let b=a;
let c=a[0]
b[4]=6
c=7
从上面我们可以得知,当我改变b中的数据时,a中数据也发生了变化;但是当我改变c的数据值时,a却没有发生改变。
传值与传址的区别
a是一个数组属于引用类型 当赋予b数据的时候传的是栈中的地址,相当于一个新的不同名的指针,并不是一个新的对象 。而c仅仅是从a堆内存中获取的一个数据值,并保存在栈中。所以b修改的时候,会根据地址回到a堆中修改,c则直接在栈中修改,并且不能指向a堆内存中。


图片.png

var a = {
key1:"11111"
}
function Copy(p) {
var c = {};
for (var i in p) {
  c[i] = p[i];
}
return c;
}
a.key2 = ['小辉','小辉'];

var b = Copy(a);
b.key3 = '33333';

alert(b.key1); //1111111
alert(b.key3); //33333
alert(a.key3); //undefined
原因是key1的值属于基本类型,所以拷贝的时候传递的就是该数据段;但是key2的值是堆内存中的对象,所以key2在拷贝的时候传递的是指向key2对象的地址,无论复制多少个key2,其值始终是指向父对象的key2对象的内存空间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就...
    木有鱼丸啦阅读 647评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,839评论 18 399
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    扶光启玄阅读 5,213评论 0 13
  • 「如何忘掉这笔债/如何加 如何减 如何数算愉快」 本来日子该过得很安稳,我该是别人眼中羡慕的对象。 我有一个疼爱我...
    甜夢每朝驚破阅读 388评论 0 0
  • 老子说:大道至简。很多人说,炒股很难,今天简单点,说一下成为“股神”的四个步骤。 1、 对于一个不懂股票的人来说,...
    武松打虎老马说股阅读 1,161评论 0 1

友情链接更多精彩内容