先来聊一下JS中比较重要的一块内容,栈(stack)和堆(heap)
栈:是一种后进先出的数据结构 Last In First Out(LIFO),也就是最新添加的项最早被移除。
栈的入口和出口是同一个,在栈的顶部(栈顶);栈中项的插入(叫做推入)和移除(叫做弹出)。存入栈中的数据会自动到达栈的底部(栈底)
栈的容量小(4MB)
所有的(基本)类型都保存在栈中——js的基本类型就5种,Undefined、Null、不是new出来的布尔、数字和字符串
接着将下堆:
堆:也是一种数据结构,它的存储方式类似于二叉树
堆的容量大
栈的速度比堆快
栈可以比喻成RAM,运行内存,速度快;堆就是ROM,存储内存,容量大
举例来说明两者之间的存储关系(如下图栈-堆图所示)
var a=10;
var name=’zhangsan’;
“=”是赋值符,操作的是栈中的值。它们都存储在栈中
继续看下面
此时打印的的结果是{name : lisi};为什么呢?
分析:对象属于引用类型的数据,new关键字调用的都是引用类型数据。
首先var声明的变量o存储在栈中;因为它是引用类型的数据,那么它用地址来进行引用绑定。在堆中开辟一个存储空间,并返回这个空间的地址,地址是16进制的,这个地址对应的是一个对象。那么栈中的o = 该地址;通过这个地址去找到堆中储存的数据。
将o的引用地址赋值给了o2,那么他们引用的是同一个堆中的地址,改变02内对象的name属性值,o引用地址中的数据也将进行变化
同理:数组也是相同的原理
总结:
引用类型做相等比较时 比较的是引用地址
如果地址相同 才为 true
地址不同则为 false
注:图中的16进制数据并非对应的真实数据