js堆内存和栈内存在js引擎中存放变量的位置主要有两个,堆内存和栈内存。和java中对内存的处理类似,栈内存主要用来存放各种基本类型的变量,包括Boolean、Number、String、Undefined、Null、**和指向对象变量的指针。这时候前端训练给stackmemory感觉就像一个线性排列的空间,每个小单元的大小基本相等。堆内存主要负责对象等变量类型的存储。栈内存中的变量一般大小已知或者有上限,算作简单存储。堆内存中存储的对象类型数据的大小一般是未知的。为什么const定义的值一部分可以改变一部分不能改变我们在定义const对象的时候,我们说的常量其实是一个指针,也就是指向const对象的堆内存不变,但是堆内存中数据本身的大小或属性是可变的。对于const定义的基本变量,这个值相当于const对象的指针,是不可变的。为什么const和let定义的变量不能定义两次?每次使用const或let初始化变量时,都会先遍历当前内存栈,看是否有同名变量,如果有则返回错误。new关键字初始化后,是否存入栈内存,根据构造函数生成新的实例。这时候生成的是一个对象,而不是一个基本类型。letstr1=newString('123')letstr2=newString('123')console.log(str1==str2,str1===str2)//falsefalse很明显,如果str1,str2存入栈在内存中,两者明明应该是相等的,结果却不相等,说明两者都存放在堆内存中,指针指向不一致。值类型和引用类型实际上是指栈内存变量和堆内存变量;值传递和引用传递,深拷贝和浅拷贝,都是围绕着栈内存,一个是处理值,一个是处理指针。内存分配和垃圾回收一般在栈内存中线性有序存储,容量小,系统分配效率高。但是堆内存必须先在堆内存中分配一个新的存储区域,然后再将指针存放在栈内存中,效率相对较低。垃圾回收:栈内存变量基本用完了就回收,而入栈内存中的变量只有调用的变量全部销毁后才能回收,因为有很多不确定的引用。
