zoukankan      html  css  js  c++  java
  • JavaScript中的堆和栈

    栈(stackstack为自动分配的内存空间,它由系统自动释放;

    堆(heap) 堆heap是动态分配的内存,大小不定也不会自动释放;

    JavaScript的数据类型分为两种,基本类型和引用类型

    1.基本类型

      Undefined、Null、Boolean、Number和
      String

    2.引用类型

       Object

    其中基本类型在内存中占据空间小、大小固定 ,他们的值保存在栈(stack)空间,是按值来访问;

    引用类型占据空间大、大小不固定, 栈内存中存放地址指向堆(heap)内存中的对象,是按引用访问的。

    如上图所示

    当我们看到一个变量类型是已知的,就分配在栈里面。其他未知的类型,比如自定义的类型,因为系统不知道需要多大,所以程序自己申请,这样就分配在堆里面。

    栈内存&堆内存垃圾回收机制

    垃圾回收机制是为了使程序运行时节约内存

    当一个方法执行时,会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈存里,随着方法的执行结束,这个方法的栈存也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;

    当我们创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本开销较大),这个运行时数据区就是堆内存。堆内存中的对象不随方法的结束而销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

    下面我们来列举两个实例

    eg1:

           var a=1;

           var b=a;

           b=2

           console.log(a)//1

    解析:

    在栈中改变一个值时相当于是一种复制行为,系统会自动为新的变量分配一个新值。var b = a执行之后,ab虽然值都等于2,但是他们其实已经是相互独立互不影响,

    并不会改变a原来的值。

    eg2:

    var m={a:1,b:2}

    var n=m;

    n.b=3;

    console.log(n.b)//3

    解析:

    在这里我们是先通过栈中的地址来访问到堆中的对应内容,并进行改变后将对应的值原路返回,因此当我改变n的值是m的值也发生了改变。

  • 相关阅读:
    hdu 1199 Color the Ball 离散线段树
    poj 2623 Sequence Median 堆的灵活运用
    hdu 2251 Dungeon Master bfs
    HDU 1166 敌兵布阵 线段树
    UVALive 4426 Blast the Enemy! 计算几何求重心
    UVALive 4425 Another Brick in the Wall 暴力
    UVALive 4423 String LD 暴力
    UVALive 4872 Underground Cables 最小生成树
    UVALive 4870 Roller Coaster 01背包
    UVALive 4869 Profits DP
  • 原文地址:https://www.cnblogs.com/sw91092/p/7499213.html
Copyright © 2011-2022 走看看