js在定义变量时完成了内存的分配
js具有自动垃圾回收机制,垃圾回收器会每隔固定的一段时间就执行一次释放操作,即找出那些不再继续使用的值,释放其占用的内存
js中最常用的是通过标记清除的算法来找到哪些对象是不再继续使用的,因此a=null只是做了释放引用的操作,让a原本对应的值失去引用,脱离执行环境,这个值会在下一次垃圾回收器执行时被找到并释放,在适当的时候解除引用,是为页面获得更好性能的一个重要方式
在局部作用域中,当函数执行完毕,局部变量也就没有存在的必要了,因此垃圾回收器很容易做出判断并回收。但是全局变量什么时候需要自动释放内存空间则很难判断,因此在我们的开发中,需要尽量避免使用全局变量,以确保性能
与C和C++不同,js没有在严格意义上区分堆内存和栈内存
可以粗浅地理解为js的所有数据都存在堆内存中
执行上下文在逻辑上实现了堆栈,需要基于堆栈数据结构的思路来理解执行上下文
栈空间的存储原理:先进后出,后进先出
js的执行上下文生成之后会创建一个叫变量对象的特殊对象,基本数据类型往往保存在变量对象中
严格意义上讲,变量对象也存在堆内存中,但是变量对象的特殊职能,在理解时仍然与堆内存区分开
基础数据类型都是按值访问,因此可以直接操作保存在变量中的实际值
与其他语言不同,js的引用数据类型,比如数组,值的大小是不固定的,引用数据类型的值是保存在堆内存中的对象,js不允许直接访问堆内存中的位置,因此不能直接操作对象的堆内存空间,在操作对象时,实际上是在操作对象的引用,而不是实际的对象
引用类型的值是按引用访问的,这里的引用可以粗浅理解为保存在变量对象中的一个地址,该地址与堆内存的实际值相关联。当要访问堆内存中的引用数据类型时,实际上是首先从变量对象中获取该对象的地址引用,然后再从堆内存中取得需要的数据
在变量对象中数据发生复制行为时,系统会自动为新的变量分配一个新值
引用类型的复制同样也会为新的变量自动分配一个新的值保存在变量对象中。不同的是,这个新的值,只是引用类型的一个引用地址,当引用地址相同时,尽管它们相互独立,但在变量对象中访问到的具体对象实际上是同一个