堆和栈有两种
一种是说的数据结构—堆,堆栈
一种是说的内存—堆内存,栈内存
我今天要说的就是堆内存和栈内存
定义
堆内存:
堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。
一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
栈内存:
由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
堆和栈在js中的应用
栈:
用于储存基本数据类型
- 每格大小有限 可做简单存储
- 只能存储基本数据类型(大小有限)
变量存储空间 | 值存储空间 |
---|---|
a | 3 |
b | fad |
c | 0x0012ff7c |
d | true |
e | 姓名 |
变量存储空间:用来存储变量
值存储空间:用来存储基本数据类型的值
堆内存
用于存放引用数据类型:数组,对象,函数
程序申请内存,查询空内存,第一个空内存的地址给到变量存在栈中指向堆内存的地址
如果将图中的变量d赋值给一个新的变量
此时不会开辟新的空间拷贝而是会将d中存的地址给新的变量,
然后储存到栈中
举个形象的例子:
把地址比做钥匙,每次需要先拿指针’领’一块空内存空间(房间),地址就像钥匙每次想进入房间做些事情需要有这个钥匙,
而变量就像是不同的人,而重新赋值就像是给他配了一把’钥匙’,
而不同的人会给这个钥匙起了不同的名字比如第一个人给他起名叫b,第二个人可能会起个e啥的,这个人可以通过变量来操作数据.
这种简单的赋值其实就是js中的浅拷贝
只复制到了个地址
如果想深拷贝可以通过
var obj2 = deepCopy(obj);
或map
可以防止修改后原数据被修改