理解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 相关文章推荐
在Javascript中定义对象类别
Dec 22 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
Apr 10 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
Jun 27 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
Jan 13 Javascript
jQuery实现购物车表单自动结算效果实例
Aug 10 Javascript
JS+CSS实现精美的二级导航效果代码
Sep 17 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
Nov 21 Javascript
JS中如何实现点击a标签返回页面顶部的问题
Jan 19 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 Javascript
ztree实现左边动态生成树右边为内容详情功能
Nov 03 Javascript
jquery层次选择器的介绍
Jan 18 jQuery
JavaScript检测浏览器是否支持CSS变量代码实例
Apr 03 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/12/25 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
Javascript继承机制详解
2017/05/30 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
python调用staf自动化框架的方法
2018/12/26 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
django框架中间件原理与用法详解
2019/12/10 Python
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
物业门卫岗位职责
2013/12/28 职场文书
积极贯彻学习两会精神总结
2014/03/17 职场文书
产品销售计划书
2014/05/04 职场文书
自强之星事迹材料
2014/05/12 职场文书
企业晚会策划方案
2014/05/29 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
开展警示教育活动总结
2015/05/09 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
python的html标准库
2022/04/29 Python
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python