理解Javascript_01_理解内存分配原理分析


Posted in Javascript onOctober 11, 2010

原始值和引用值
在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值。
原始值指的就是代表原始数据类型(基本数据类型)的值,即Undefined,Null,Number,String,Boolean类型所表示的值。
引用值指的就是复合数据类型的值,即Object,Function,Array,以及自定义对象,等等

栈和堆
与原始值与引用值对应存在两种结构的内存即栈和堆
栈是一种后进先出的数据结构,在javascript中可以通过Array来模拟栈的行为

var arr = []; //创建一个栈 
arr.push("apple");//压入元素"apple" ["apple"] 
arr.push("orange");//压入元素"orange" ["apple","orange"] 
arr.pop();//弹出"orange" ["apple"] 
arr.push("banana");//压入元素"banana" ["apple","banana"]

我们来看一下,与之对应的内存图:
理解Javascript_01_理解内存分配原理分析
原始值是存储在栈中的简单数据段,也就是说,他们的值直接存储在变量访问的位置。
堆是存放数据的基于散列算法的数据结构,在javascript中,引用值是存放在堆中的。
引用值是存储在堆中的对象,也就是说,存储在变量处的值(即指向对象的变量,存储在栈中)是一个指针,指向存储在堆中的实际对象.
例:var obj = new Object(); obj存储在栈中它指向于new Object()这个对象,而new 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,"jxl",22);

然后我们来看一下内存分析图:
理解Javascript_01_理解内存分配原理分析
变量num,bol,str为基本数据类型,它们的值,直接存放在栈中,obj,person,arr为复合数据类型,他们的引用变量存储在栈中,指向于存储在堆中的实际对象。

由上图可知,我们无法直接操纵堆中的数据,也就是说我们无法直接操纵对象,但我们可以通过栈中对对象的引用来操作对象,就像我们通过遥控机操作电视机一样,区别在于这个电视机本身并没有控制按钮。

现在让我们来回答为什么引用值要放在堆中,而原始值要放在栈中的问题:

记住一句话:能量是守衡的,无非是时间换空间,空间换时间的问题

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

总结:

程序很简单,但它是一切的根本,基础是最重要的,因为摩天大厦也是一块砖一块瓦的搭建起来的。
内存是程序执行的根本,搞懂了内存,就等于搞懂了一切。
心血之作,鼓励一下自已,加油!

参考:
JavaScript高级程序设计

Javascript 相关文章推荐
封装了一个js图片轮换效果的函数
Sep 28 Javascript
javascript数组操作方法小结和3个属性详细介绍
Jul 05 Javascript
js实现jquery的offset()方法实例
Jan 10 Javascript
由ReactJS的Hello world说开来
Jul 02 Javascript
JavaScript如何动态创建table表格
Aug 02 Javascript
原生js实现倒计时--2018
Feb 21 Javascript
基于JavaScript实现淘宝商品广告效果
Aug 10 Javascript
微信小程序之滚动视图容器的实现方法
Sep 26 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
Jul 19 Javascript
Vue通过ref父子组件拿值方法
Sep 12 Javascript
详解适配器在JavaScript中的体现
Sep 28 Javascript
Ajax请求时无法重定向的问题解决代码详解
Jun 21 Javascript
javascript getElementsByClassName实现代码
Oct 11 #Javascript
javascript Array.prototype.slice使用说明
Oct 11 #Javascript
javascript 伪数组实现方法
Oct 11 #Javascript
javascript forEach通用循环遍历方法
Oct 11 #Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 #Javascript
JavaScript isArray()函数判断对象类型的种种方法
Oct 11 #Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
Oct 11 #Javascript
You might like
浅谈php扩展imagick
2014/06/02 PHP
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
js+html5实现侧滑页面效果
2017/07/15 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
Python完全新手教程
2007/02/08 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
PyCharm+Miniconda3安装配置教程详解
2021/02/16 Python
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
最新茶叶店创业计划书
2014/01/14 职场文书
小学防溺水制度
2014/01/29 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
教师师德表现自我评价
2015/03/05 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL