js中的堆和栈

155 阅读1分钟

堆和栈的概念

堆和栈是程序运行时在计算机内存中开辟的临时存储空间。也就是说堆和栈是用来存储数据的。

堆:存储对象和数组和所有new出来的实例

栈:存储变量

计算机内存地址的概念

存储在计算机内存中的所有数据都是拥有唯一地址符的,通过这个地址符就能准确的访问数据

堆栈存储的示例图

以下代码的存储情况

var a = 12;
var b = a;

图片.png

var a=12;
var b =a;
b+=1;

图片.png

var a = 12;
var b = a;
var arr = [1,2,3];
var obj = {name:'QHX',age:21};

图片.png

var a = 12;
var b = a;
var arr=[1,2,3];
var arr2 = arr;
var obj = {name:'QHX',age:21};
var obj2 = obj;

图片.png

var a = 12;
var b = a;
var arr=[1,2,3];
var arr2 = [];
var obj = {name:'QHX',age:21};
var obj2 = new Object();

图片.png

引用数据类型(数组,对象,函数)的名字存储在栈中,栈中还存储了引用数据类型具体值在堆中存储的地址,引用数据类型的具体值存储在堆中。

基础数据类型(number、String、Boolen、null、undefined)的名字和值都存放在栈中

每一个基础数据类型在栈中都是独立的,理论上互不影响,改变a的值无法修改b的值

引用数据类型赋值,实际上是将堆地址符共享,相互赋值指向同一个堆内存,改变a就能改变b,改变b也能改变a。这是浅复制。

深复制,也就是互不影响。实现方式:创建一个新的引用数据类型,遍历原来的引用数据类型,将堆中的值赋值给新的引用数据类型。