javascript:栈内存与堆内存浅谈

首先,我们来举个爪子:

var m = 1;
var n = m;
n=2;
console.log(m);

 

大家觉得答案是什么?是一的情自觉点赞,不开玩笑了,其实这个很简单,对吧。那么我们再来一个

var m = { a: 10, b: 20 }
var n = m;
n.a = 15;
console.log(m.a);

这回大家觉得答案是什么?是15还是10?为什么是15?

觉得有点蒙,那么请听我细细来讲

对于基本数据类型还有引用类型,我上篇博客已经讲解了,而且也提到了栈内存与对内存,现在我们的重点就是这两个


栈内存:
栈内存:后进先出(系统分配的)

什么意思?就比如我们买一筒羽毛球,当我们打完球,肯定是要放回去,下回我们打的时候,肯定也是拿的第一个,最上面那个,对吧,相似的,

当我们定义了一个羽毛球为m,打完球了,我们放回去,放在栈里,这时候他是最上面那个,所以我们下回也是拿那个m

当我们遇到对手了,想用黑色羽毛球一绝胜负,我们怎么拿到放在最底层,珍藏多年的球?肯定要把最上面的球m拿出来,再拿第二个出来。。。。。最后拿到我们的那个球

这就是栈内存的后经先出,那到底什么是栈内存?

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

这时候mark一下,下篇博客在讲解,先来了解下什么是堆内存

堆内存

现在我们桌面上有很多本书,散乱的放着,我们要拿起其中一本书,我们不需要动到其他的书籍,这时候就是堆内存,毕竟是一堆书嘛

堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。

现在回顾最开始的那个问题,请先记死一句话“
js不允许去直接使用堆内存,所以操作的时候我们是操作的是栈的对象,而不是直接操作内存的对象


什么意思?不懂是吧,没关系,我们来开局第一个例子,首先,我们定义了一个变量a,但是按照这句话的意思,我们不是直接划分了一个区间为1


的,名字为a的空间,而是划分了一个空间用来存储我们的变量1,然后再建设一个路标,一个指针,一个针眼,一个a去告诉我们那个信息在哪儿,然后!当我们使得b=a的时候,我们把那个路标,针眼又差了一遍,接着!我们修改了b=4;这是什么意思?直接修改了b所指向的那个名字叫1的空间吗?很明显不可能。为什么?因为
js不允许去直接使用堆内存,所以操作的时候我们是操作的是栈的对象,而不是直接操作内存的对象

那我们只能是再去创造一个空间,那么这时候a和b所指向的空间完全不同!那么答案肯定就是不一样,但是这里我们也注意到了,他只是个路标,一个针眼,请记住,一个针眼最贵是75块钱


接着,第二道题,我们一样的解析,但是注意!

a: 10, b: 20

这一部分是存放在哪儿的?对内存的,真的吗?,真正的流程是这样的我们通过var n = m执行一次复制引用类型的操作。引用类型的复制同样也会为新的变量自动分配一个新的值保存在变量对象中,但不同的是,这个新的值,仅仅只是引用类型的一个地址指针。当地址指针相同时,尽管他们相互独立,但是在变量对象中访问到的具体对象实际上是同一个。所以最终就出现了呢个结局。


对于堆内存,你可以理解为他是一个自带针眼的大野刀,它既有针眼的功能,又是有吸血,回南的基本功能,还可能有攻速,法强等,所以我身上带着个眼石,和打野刀,哪个更轻?哪个更快捷?哪个功能更全面?


当前,了解这些还是不够的,我们还需要了解js更多的底层,比如我们最常遇到的作用域,这个下回再讲,我去打野了


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值