什么是堆和栈?
堆和栈都是运行时内存中分配的一个数据区,因此也被称为堆区和栈区,但二者存储的数据类型和处理速度不同。
在js中的数据结构大致可以分为两种:
基本类型:Undefined、Null、Boolean、Number 和 String,这5中基本数据类型可以直接访问,他们是按照值进行分配的,存放在栈(stack)内存中的简单数据段,数据大小确定,内存空间大小可以分配。
引用类型:即存放在堆(heap)内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。
stack栈的特点:先进后出,栈内存好比一个有底没有高的盒子,数据线存放在盒子底部;
js的基本数据是不可改变的;改变原始值的唯一途径是覆盖;
传值
从一个向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终指向同一个对象。即复制的是栈中的地址而不是堆中的对象。
从一个变量复向另一个变量复制基本类型的值,会创建这个值的副本。
shack的理解
var a =10; //这一步会在shack中保存一个值10;
var b = a; //这一步会在shack中复制一份a的值重新保存在一个地方;
a = 15; //这一步会覆盖第一次保存在shack中的值,与b中的值没有关系
console.log(b); // 10
heap的理解
var obj1 = {name:'bangbang',age:18};
var b = obj1;
var c = obj1.age;
console.log(b.name); //bangbang
console.log(c); //18
//改变b和c的值
b.name = 'yanniu';
c = 22;
console.log(obj1.name); //yanniu
console.log(obj1.age); //18
以上看出:当我们改变b的数据的时候,我们看到了obj1.name的数据也在改变,但是我们改变c的数据的时候发现,obj1.age的值没有变化,这说明了:b和obj1变量操作的是同一个对象,c和obj1完全独立的。图示如下: