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的值也发生了改变。

  • 相关阅读:
    matrix
    meizi
    公文流转系统
    10.21连接数据库进行添加
    9.27
    9.23课堂总结
    信息管理java
    大道至简读后感
    第二周
    7.7第一周
  • 原文地址:https://www.cnblogs.com/sw91092/p/7499213.html
Copyright © 2011-2022 走看看