理解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 this关键字的问题
Jan 09 Javascript
js/jquery去掉空格,回车,换行示例代码
Nov 05 Javascript
javascript:json数据的页面绑定示例代码
Jan 26 Javascript
详解Javascript 装载和执行
Nov 17 Javascript
Js与Jq 获取页面元素值的方法和差异对比
Apr 30 Javascript
jQuery增加自定义函数的方法
Jul 18 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
Apr 16 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
Aug 03 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 Javascript
vue动态组件实现选项卡切换效果
Mar 08 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
Oct 10 Javascript
vue集成kindeditor富文本的实现示例代码
Jun 07 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
解析crontab php自动运行的方法
2013/06/24 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
javascript实现鼠标拖动改变层大小的方法
2015/04/30 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
js 获取html5的data属性实现方法
2017/07/28 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
python实现BackPropagation算法
2017/12/14 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
python实现无边框进度条的实例代码
2020/12/30 Python
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
会计电算化专业应届大学生求职信
2013/10/22 职场文书
广告创意求职信
2014/03/17 职场文书
文案策划求职信
2014/04/14 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python