美文网首页
JavaScript---变量内存分配

JavaScript---变量内存分配

作者: 一座被占用 | 来源:发表于2017-03-01 12:02 被阅读0次

今天来看一下JavaScript在定义变量的时候是如何给变量分配内存的

ECMAScript变量包含两种类型:基本类型、引用类型

基本类型

定义:直接保存在栈内存中的简单数据段

包含:Undefined、Null、Boolean、Number和String,在内存中分别占有固定大小的空间,一般称他为按值访问。

引用类型

定义:保存在堆内存中的对象

包含:Object、Function、Array和自定义的对象。

变量中实际上保存的只是一个指向值的一个指针,这个指针指向内存中的另外一个位置,这个位置保存着值。该位置保存对象由于这种类型大小不固定(比如数组是可以动态增加的),不能保存在栈内存中,但是他们的内存地址是固定的,所以将地址存储在栈内存中,当查询引用类型的变量时,就先在栈内存中查询内存地址,然后找到保存在堆中的值。这种方式一般称为“按引用”访问,因为我们操作的不是实际值,而是被这个值引用的对象。


讲个例子和我的理解

例子 输出结果

那么这里面的变量内存是如何变化的呢?

首先第一行,var a = "hello",b = "hi";

在栈内存中分配了两个内存,用来存储string类型的“hello”和"hi",假设“hello”的地址为100,“hi”的地址为101,那么变量a保存的值为“hello”的地址,也就是100;b保存的值为“hi”的地址,也就是101。

变量a、b内存分配

执行函数exchange的时候内存变化:

exchange函数内存变化

结束以后就可以看到a的地址为101,指向了“hi”,b和c的地址为100,指向了“hello”。然后console的时候就可以通过a和b的地址来找到栈中的值,然后就可以看到的结果:hi hello

额,上面好像错了,这里不应该直接用a和b,exchange的参数a和b和外面的a和b是两个不同的东西。但是意思还是那个意思。

最后执行的console输出的是hello hi 关系到变量范围,在这篇文章就不阐述了。

那么,“hello”什么时候被释放呢?这里面有一个计数器,记录有几个变量在指向或者应用到这个“hello”,当计数器变为0的时候,这个“hello”的内存就自动释放了。


个人理解,如果有错误,不当的地方。望指正!

最后贴出参考地址:http://www.cnblogs.com/purediy/archive/2012/09/12/2682482.html  感谢该博主

相关文章

  • JavaScript---变量内存分配

    今天来看一下JavaScript在定义变量的时候是如何给变量分配内存的 ECMAScript变量包含两种类型:基本...

  • C语言内存分配(重)

    内存分配的类型: 静态内存分配: 全局变量、静态全局变量、静态局部变量; 静态内存分配是在程序编译时分配的内存空间...

  • Java学习-3-基本数据类型

    变量申请内存来存储值。当创建变量的时候,需要在内存申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空...

  • node var

    node中var才会分配内存,单独变量接收不会新分配内存

  • JVM 内存管理

    内存管理=内存分配+内存回收 内存分配 JMM指Java内存管理线程之间的共享变量存储在主内存(main memo...

  • Android内存优化分析

    1.内存分配策略 对象 / 变量的内存分配 由程序自动 负责 共有3种:静态分配、栈式分配、 & 堆式分配,分别面...

  • 动态内存分配

    自动分配内存:当定义以基本类型的变量的时候,系统会地方为这个变量自动分配内存,这个 内存在堆上。当作用域结束,系统...

  • Java的数据类型

    创建变量时,需要在内存中申请空间。内存管理根据变量的类型为变量分配空间,分配的空间,只能用来存储该类型的数据。 ...

  • Java学习笔记4(对象与内存的控制)

    Java 内存管理分为:内存分配和内存回收实例变量 和 类变量 局部变量 特点:作用时间短,存储在方法的栈内存中 ...

  • malloc

    1:malloc分配内容和变量分配内存的区别 2:返回值

网友评论

      本文标题:JavaScript---变量内存分配

      本文链接:https://www.haomeiwen.com/subject/igjqgttx.html