资讯专栏INFORMATION COLUMN

JS学习系列08 - 内存分配

_ang / 2948人阅读

摘要:本文会同步到我的个人网站中。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。

本文会同步到我的个人网站中。

在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的变量名作为指针存放在栈中,指向堆中的变量内容

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

为什么要分堆和栈

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

总结

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

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

欢迎关注我的公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107848.html

相关文章

  • 我的阿里之路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0
  • 【译】JavaScript是如何工作的:内存管理 + 如何处理4个常见的内存泄露

    摘要:本文作为第三篇,将会讨论另一个开发者容易忽视的重要主题内存管理。我们也会提供一些关于如何处理内存泄露的技巧。这是当前整型和双精度的大小。然而,这是一组可以收集的内存空间的近似值。 本文转载自:众成翻译译者:Leslie Wang审校: 为之漫笔链接:http://www.zcfy.cc/article/4211原文:https://blog.sessionstack.com/how-j...

    IntMain 评论0 收藏0
  • java 基础 - 收藏集 - 掘金

    摘要:基础知识复习后端掘金的作用表示静态修饰符,使用修饰的变量,在中分配内存后一直存在,直到程序退出才释放空间。将对象编码为字节流称之为序列化,反之将字节流重建成对象称之为反序列化。 Java 学习过程|完整思维导图 - 后端 - 掘金JVM 1. 内存模型( 内存分为几部分? 堆溢出、栈溢出原因及实例?线上如何排查?) 2. 类加载机制 3. 垃圾回收 Java基础 什么是接口?什么是抽象...

    makeFoxPlay 评论0 收藏0
  • 渣渣为什么要看 ElasticSearch 源码?

    摘要:当时自己在本地测试搭建集群后,给分配了另外一个任务就是去了解中的自带分词英文分词中文分词的相同与差异以及自己建立分词需要注意的点。还有就是官网的文档了,非常非常详细,还有,版本的是有中文的官方文档,可以凑合着看。 前提 人工智能、大数据快速发展的今天,对于 TB 甚至 PB 级大数据的快速检索已然成为刚需,大型企业早已淹没在系统生成的浩瀚数据流当中。大数据技术业已集中在如何存储和处理这...

    Cciradih 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<