理解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同时按下两个方向键
Dec 01 Javascript
javascript EXCEL 操作类代码
Jul 30 Javascript
js不能跳转到上一页面的问题解决方法
Mar 01 Javascript
jquery简单实现图片切换效果的方法
May 12 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
JS获取填报扩展单元格控件的值的解决办法
Jul 14 Javascript
JavaScript判断日期时间差的实例代码
Mar 01 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
Aug 28 Javascript
vue.js中使用echarts实现数据动态刷新功能
Apr 16 Javascript
WEB前端性能优化的7大手段详解
Feb 04 Javascript
javascript实现打砖块小游戏(附完整源码)
Sep 18 Javascript
Python机器学习之决策树和随机森林
Jul 15 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
Get或Post提交值的非法数据处理
2006/10/09 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
php导出excel格式数据问题
2014/03/11 PHP
php获取域名的google收录示例
2014/03/24 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
laravel 自定义常量的两种方案
2019/10/14 PHP
基于jQuery的表格操作插件
2010/04/22 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
python多线程socket编程之多客户端接入
2017/09/12 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
python elasticsearch环境搭建详解
2019/09/02 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
自荐信的五个重要部分
2013/10/29 职场文书
报到证丢失证明
2014/01/11 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server