栈和堆作为内存分配的一个数据区,分别保存着不同结构的数据。前者主要保存着基本数据类型,即,后者主要保存数组及对象。一般而言,栈由于保存的数据是稳定,简单的,所以比较灵活;而堆由于数据结构不稳定,也较为复杂,因此往往在js运行时耗时较多。
两者的区别是:栈是先进后出的数据流入和流出方式,后者是先入先出,队列优先。
这段话不知道你理解吗?
所以为了更加好理解,权且做了一个有点类似的比喻:
你可以把栈想象为,把堆想象为。
就是下面这幅图:
,操作方便灵活,可以直接拉取即可;而则需要用钥匙打开,比较麻烦,每次取一次东西都极为不方便。
每次放入的不贵重杂物(---“5个基本数据类型”),都是先放的容易被后面堵住,要最后才能拿到。不知道你有没有这样的经验..-----
而每次放到里的基本是首饰、金币、钞票。我们权且都想象成钞票就行(----“数组及对象类型”)。此时你屯的钱太多了,容易发灰,所以每次打开保险柜取钱的时候,都要把第一批先存放的钞票拿出来,放到太阳底下晒一晒以防发灰。----。
两者是如何交互的?
存放到栈里变量类型可以是基本数据,也可以是引入数据,
如下:
而b作为栈的一个变量,其地址是指向堆区的。
1、函数没有调用,就没有伤害:
2、
3、
4、
如果你还不明白,以下:
这个其实简化为:
我们可以得出结论:栈和堆中的指向有较大的区别,如果栈中值是一样的,则指向同一个:比如
我们可以这样表示:
但这个情况跟堆区是不同的。
堆里两个数据进行对比,即使值一样,但也会有区别。因为两者的引入地址指向都不同。
比如
同样的:
不全等情况下,是true;全等情况是false,如下:
所以,面对这突如其来的各种function和非function所造成的坑,完全没有必要恐惧!
遇到类似问题的时候,判断栈区和堆区的数据是否互相影响,步骤为:
需要先建立一个栈区和堆区的概念
根据代码实际情况,层层剖析,看是否创造新栈,新堆,还是共用同一个栈堆值。
以上是关于栈区和堆区所做的一些总结。
作者介绍:
yixiang / 北 京,毕业于上海理工工业设计系,前端工程师 ,nodejs爱好者,时间管理爱好者,每日一小步,愿与你同行..
领取专属 10元无门槛券
私享最新 技术干货