JavaScript中的堆栈

  • 栈(stack) 栈stack为自动分配的内存空间,它由系统自动释放;
  • 堆(heap) 堆heap是动态分配的内存,大小不定也不会自动释放。
JavaScript 中的变量分为基本类型和引用类型。
  • 基本类型 (Undefined、Null、Boolean、Number和String)
    基本类型在内存中占据空间小、大小固定 ,他们的值保存在栈(stack)空间,是按值来访问
  • 引用类型 (对象、数组、函数)
    引用类型占据空间大、大小不固定, 栈内存中存放地址指向堆(heap)内存中的对象。是按引用访问的

以下图所示:栈内存中存放的只是该对象的访问地址, 在堆内存中为这个值分配空间 。 因为这种值的大小不固定,所以不能把它们保存到栈内存中。但内存地址大小的固定的,所以能够将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 而后再经过地址找到堆中的值。数组

image

当咱们看到一个变量类型是已知的,就分配在栈里面,好比INT,Double等。其余未知的类型,好比自定义的类型,由于系统不知道须要多大,因此程序本身申请,这样就分配在堆里面。函数

栈内存&堆内存

为了使程序运行时占用的内存最小,一般要实现垃圾回收机制。spa

当一个方法执行时,每一个方法都会创建本身的内存栈,在这个方法内定义的变量将会逐个放入这块栈存里,随着方法的执行结束,这个方法的栈存也将天然销毁了。所以,全部在方法中定义的变量都是放在栈内存中的;3d

当咱们在程序中建立一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(由于对象的建立成本开销较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即便方法结束后,这个对象还可能被另外一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。指针

思考问题code

demo1.
var a = 1;
var b = a;
b = 2;

// 这时a是?

demo1中在变量对象中的数据发生复制行为时,系统会自动为新的变量分配一个新值。var b = a执行以后,b虽然从新赋值为2,可是他们其实已是相互独立互不影响的值了。对象

demo2.
var m = { a: 1, b: 2 }
var n = m;
n.a = 2;

// 这时m.a的值呢?

demo2中咱们经过var n = m执行一次复制引用类型的操做。引用类型的复制一样也会为新的变量自动分配一个新的值保存在变量对象中,但不一样的是,这个新的值,仅仅只是引用类型的一个地址指针。当地址指针相同时,尽管他们相互独立,可是在变量对象中访问到的具体对象其实是同一个。所以当我改变n时,m也发生了变化。这就是引用类型的特性。blog

相关文章
相关标签/搜索