理解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 相关文章推荐
IE php关于强制下载文件的代码
Aug 23 Javascript
XmlUtils JS操作XML工具类
Oct 01 Javascript
JavaScript数组随机排列实现随机洗牌功能
Mar 19 Javascript
Jquery网页内滑动缓冲导航的实现代码
Apr 05 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
Feb 16 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
Apr 01 Javascript
JavaScript实现广告弹窗效果
Aug 09 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
javascript 显示全局变量与隐式全局变量的区别
Feb 09 Javascript
js分页之前端代码实现和请求处理
Aug 04 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
May 03 jQuery
vue如何截取字符串
May 06 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中sprintf与printf函数用法区别解析
2014/02/17 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
19个Android常用工具类汇总
2014/12/30 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
Python数据类型学习笔记
2016/01/13 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
实例详解Python模块decimal
2019/06/26 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
合作经营协议书范本
2014/04/17 职场文书
无线电知识基础入门篇
2022/02/18 无线电
Kubernetes控制节点的部署
2022/04/01 Servers
python实现手机推送 代码也就10行左右
2022/04/12 Python