JavaScript - 内存分配

在ECMAScript中,变量可以存放两种类型的值

  • 原始值

  • 引用类型值

原始值指的是代表原始数据类型的值,例如:undefined null number string boolean

引用类型指的是复合类型值,例如:object function array 自定义对象

堆和栈

  • 栈是一种LIFO的数据结构,即后进先出,队列是一种FIFO的数据结构,即先进先出

  • 堆是基于散列算法存放数据的一种数据结构

  • 原始值是存放在栈中的简单数据段,它们的值直接存储在变量访问的位置,例如:


var num = 10;      //变量名num和初始化值10都存放在栈中

  • 引用值是存放在堆中的对象,引用值的变量名是一个存放在栈中指针,指向堆中的引用值对象,例如:

var obj = new object();    //变量名obj存放在栈中,而它指向的object()对象是存放在堆中的

为什么原始值要放在栈中,引用值要放在堆中?

  • 先看一段代码

function Person(id,name,age){

this.id = id;

this.name = name;

this.age = age;

}

var num = 10;

var bol = true;

var str = "abc";

var obj = new Object();

var arr = ['a','b','c'];

var person = new Person(100,"笨蛋的座右铭",25);

  • 内存分析
内存分析图
内存分析图
  • 原始类型变量num bol str的变量名和内容都存放在栈中

  • 引用类型变量obj arr person的变量名作为指针存放在栈中,指向堆中的变量内容

由上图可以看出,我们不能直接操作堆中的数据,也就是说不能直接操作对象,但我们可以通过栈中存放的变量指针来进行操作

  • 为什么要分堆和栈

堆比栈大,栈比堆的运算速度快,对象是一个复杂的结构,并且可以自由扩展,如:数组可以无限扩充,对象可以自由添加属性。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。不将简单数据类型放在堆是因为通过引用到堆中查找实际对象是要花费时间的,而这个综合成本远大于直接从栈中取得实际值的成本。所以简单数据类型的值直接存放在栈中

总结

  • 两种变量类型:原始值和引用类型值

  • 变量在内存中的存放位置分为堆和栈

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,376评论 11 349
  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 2,620评论 2 26
  • 栈和堆 栈:由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(后进先出,...
    hertzey阅读 170评论 0 0
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,744评论 0 11
  • 也许我不是想要你的感同身受 或许只是想跟你聊聊我的不开心 你听听也就不要放心上
    帽子戏法阅读 231评论 0 0