理解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 相关文章推荐
Save a File Using a File Save Dialog Box
Jun 18 Javascript
菜鸟学习JavaScript小实验之函数引用
Nov 17 Javascript
js验证是否为数字的总结
Apr 14 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
Apr 24 Javascript
js统计页面的来访次数实现代码
May 09 Javascript
jQuery插件制作之参数用法实例分析
Jun 01 Javascript
JQuery插入DOM节点的方法
Jun 11 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
解决vue项目使用font-awesome,build后路径的问题
Sep 01 Javascript
JS 5种遍历对象的方式
Jun 16 Javascript
vue下载二进制流图片操作
Oct 26 Javascript
React如何使用axios请求数据并把数据渲染到组件
Aug 05 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作的文本留言本的例子(二)
2006/10/09 PHP
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
vue操作下拉选择器获取选择的数据的id方法
2018/08/24 Javascript
python3.0 字典key排序
2008/12/24 Python
python实现逆波兰计算表达式实例详解
2015/05/06 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
深入浅析Python的类
2018/06/22 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
Perfume’s Club德国官网:在线购买香水
2019/04/08 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
高级方案规划工程师岗位职责
2013/11/29 职场文书
公司晚会策划方案
2014/05/17 职场文书
演讲比赛策划方案
2014/06/11 职场文书
汽修专业自荐信
2014/07/07 职场文书
公司外出活动方案
2014/08/14 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
2014年底个人工作总结
2015/03/10 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
爱心捐书倡议书
2015/04/27 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python