JavaScript的堆栈和基本类型、引用类型
简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。
基本类型:
1.在存储时变量中存储的值就是本身,因此叫做值类型。
2.保存具体数据的值。
3.基本类型的值不可变,动态修改了他们的值实际上返回的是新的值,它的原始值不会被改变。
4.基本类型的比较是值比较,只要他们的值相等就认为他们是相等的。在做比较的使用应使用严格的 === 号,因为 == 号会进行类型转换。
5.基本类型的赋值是是在内存中开辟一段栈内存,然后然后再将值赋值到新的栈内存中。基本类型的变量赋值,变量之间相互独立不受影响。
6.值类型的数据有 string 、number、boolean、undefined、null
引用类型:
1.保存数据的值的指针。
2.引用数据类型在存储变量时存储的仅仅是地址(引用),因此叫做引用数据类型。
3.通过new关键词可以创建对象(系统对象、自定义对象)
4.引用类型的数据存放在堆内存中,变量实际上只是一个存放在栈内存中的指针,这个指针指向堆内存中的地址。
5.引用类型的值是可变的。每次对引用类型的操作是其实是操作其对象的引用(保存在栈内存中的指针)。
6.引用类型的比较是引用的比较。
7.引用类型的赋值是传址,共享同一份内存空间,两个变量指向同一对象,两个变量之间的操作会互相影响。(如果想让新变量的操作不影响就变量可以使用一些函数方法生成新的对象,例如:数组可以使用 concat、slice ,对象可以使用 Object.assign 等方法)
引用类型有 Object、Array、Date 等
堆栈空间分配:
栈:
由操作系统自动分配释放的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。简单数据类型存放在栈内存中。
堆:
存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。复杂类型的数据存放在堆内存中。
注意:JavaScript本身没有堆栈的概念,所谓堆栈只是通过其他语言来更好的来理解JavaScript的存储机制。