浅说·Javascript“栈“和“堆

栈和堆作为内存分配的一个数据区,分别保存着不同结构的数据。前者主要保存着基本数据类型,即,后者主要保存数组及对象。一般而言,栈由于保存的数据是稳定,简单的,所以比较灵活;而堆由于数据结构不稳定,也较为复杂,因此往往在js运行时耗时较多。

两者的区别是:栈是先进后出的数据流入和流出方式,后者是先入先出,队列优先。

这段话不知道你理解吗?

所以为了更加好理解,权且做了一个有点类似的比喻:

你可以把栈想象为,把堆想象为。

就是下面这幅图:

,操作方便灵活,可以直接拉取即可;而则需要用钥匙打开,比较麻烦,每次取一次东西都极为不方便。

每次放入的不贵重杂物(---“5个基本数据类型”),都是先放的容易被后面堵住,要最后才能拿到。不知道你有没有这样的经验..-----

而每次放到里的基本是首饰、金币、钞票。我们权且都想象成钞票就行(----“数组及对象类型”)。此时你屯的钱太多了,容易发灰,所以每次打开保险柜取钱的时候,都要把第一批先存放的钞票拿出来,放到太阳底下晒一晒以防发灰。----。

两者是如何交互的?

存放到栈里变量类型可以是基本数据,也可以是引入数据,

如下:

而b作为栈的一个变量,其地址是指向堆区的。

1、函数没有调用,就没有伤害:

2、

3、

4、

如果你还不明白,以下:

这个其实简化为:

我们可以得出结论:栈和堆中的指向有较大的区别,如果栈中值是一样的,则指向同一个:比如

我们可以这样表示:

但这个情况跟堆区是不同的。

堆里两个数据进行对比,即使值一样,但也会有区别。因为两者的引入地址指向都不同。

比如

同样的:

不全等情况下,是true;全等情况是false,如下:

所以,面对这突如其来的各种function和非function所造成的坑,完全没有必要恐惧!

遇到类似问题的时候,判断栈区和堆区的数据是否互相影响,步骤为:

需要先建立一个栈区和堆区的概念

根据代码实际情况,层层剖析,看是否创造新栈,新堆,还是共用同一个栈堆值。

以上是关于栈区和堆区所做的一些总结。

作者介绍:

yixiang / 北 京,毕业于上海理工工业设计系,前端工程师 ,nodejs爱好者,时间管理爱好者,每日一小步,愿与你同行..

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180226G011J000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券