理解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 相关文章推荐
做网页的一些技巧(续)
Feb 01 Javascript
基于jQuery替换table中的内容并显示进度条的代码
Aug 02 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
Jan 14 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
Sep 17 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
vue.js如何将echarts封装为组件一键使用详解
Oct 10 Javascript
vue中element 上传功能的实现思路
Jul 06 Javascript
vue 动态绑定背景图片的方法
Aug 10 Javascript
Angular如何由模板生成DOM树的方法
Dec 23 Javascript
详解node和ES6的模块导出与导入
Feb 19 Javascript
详解JavaScript 异步编程
Jul 13 Javascript
Angular性能优化之第三方组件和懒加载技术
May 10 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数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
万能的php分页类
2017/07/06 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
Python WEB应用部署的实现方法
2019/01/02 Python
python解析xml简单示例
2019/06/21 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
python调用百度API实现人脸识别
2020/11/17 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
个人自我鉴定怎么写
2013/10/28 职场文书
自荐信怎么写呢?
2013/12/09 职场文书
关于逃课的检讨书
2014/01/23 职场文书
毕业自我评价
2014/02/05 职场文书
经验交流材料格式
2014/12/30 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
初二物理教学反思
2016/02/19 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
spring cloud 配置中心native配置方式
2021/09/25 Java/Android