理解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 相关文章推荐
document.getElementById为空或不是对象的解决方法
Jan 24 Javascript
jquery 插件学习(五)
Aug 06 Javascript
Jquery动态进行图片缩略的原理及实现
Aug 13 Javascript
node.js中的querystring.stringify方法使用说明
Dec 10 Javascript
Angular用来控制元素的展示与否的原生指令介绍
Jan 07 Javascript
在父页面得到zTree已选中的节点的方法
Feb 12 Javascript
基于jQuery实现火焰灯效果导航菜单
Jan 04 Javascript
浅谈vuejs实现数据驱动视图原理
Feb 23 Javascript
js实现点赞按钮功能的实例代码
Mar 06 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
Apr 13 Javascript
Vue3 实现双盒子定位Overlay的示例
Dec 22 Vue.js
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
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
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php实现分页工具类分享
2014/01/09 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
python中stdout输出不缓存的设置方法
2014/05/29 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
python中wheel的用法整理
2020/06/15 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
竞选班长演讲稿
2013/12/30 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
2014年大班元旦活动方案
2014/02/26 职场文书
母亲节感恩活动记录
2014/03/16 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
荒岛余生观后感
2015/06/09 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
中学教师教学工作总结
2015/08/13 职场文书