深入理解javascript系列(二):内存空间
因为javascript有GC存在,所以内存空间并不是被我们重视。王立大神说"理解内存空间,就是成为大牛的开始"。所以我们很有必要学习和理解内存空间。
2.1 基础数据类型与变量对象
最新的ECMAScript标准定义了7中数据类型,其中就包括6中基本数据与一种引用数据类型(object)
其中基础数据类型如图所示:
下面来探讨一个问题,有一个很简单的例子如下所示:
function fn() {var a1 = 10;var a2 = 'hello';var a3 = null;
}
现在需要思考的是当fn()的时候,局部变量a1它们都保存在什么地方?
函数运行时,会创建一个执行环境,这个执行环境叫做执行上下文(Execution Context)。在执行上下文中,会创建一个叫做变量对象(VO)的东西。基础类型都保存在这里了。
变量对象也存在与堆内存中,但是由于变量对象有特殊的功能,所以我们还是尽量将它与堆内存区别看待。
2.2 引用数据类型与堆内存空间
引用数据类型(Object)的值是保存在堆内存中的。但是我们之前也讲过,在javascript中,不允许直接操作堆内存。所以操作对象时,实际上是操作对象的引用。因此引用数据类型都是按引用访问的。这里的引用,可以理解为保存在变量对象中的一个地址,该地址与堆内存中的对象相关联。
为了更好地理解变量对象与堆内存,下面用一个例子与图解配合讲解。
function foo() {var a1 = 10;var a2 = 'hello';var a3 = null;var b = { m: 20};var c = [1,2,3];
}
再来重复一次。函数运行时,会创建一个执行环境,我们把这个执行环境称为执行上下文。在执行上下文中,会创建一个变量对象(VO)。基本数据类型的值往往都保存在变量对象中。
如下图所示,当我们想要访问堆内存空间中的引用数据类型时,实际上是通过引用(地址指针)来访问的。
在前端面试中,我们常常会遇到这样一个类似的问题。
//demo01.js
var a = 20;
var b = a;
b = 30;
console.log(a); // a ? 这时a的值多少
//demo02.js
var m = { a:10, b:20};
var n = m;
n.a = 15;
//这时m.a的值是多少?
当变量对象中的数据发生复制行为时,新的变量会被分配一个新的值。所以基本数据类型只是复制了一个,而引用数据类型了不光是复制了同一个引用地址,并且指向同一个地方。
2.3 内存空间管理
因为GC的存在,使得我们在开发时好像并不用那么关心内存的使用问题,内存的分配与回收完全实现了自动管理(但这并不代表他不会泄漏)。阳波大神说:“了解内存机制有助于自己清晰地认知到自己写的代码在执行过程中都发生了什么,从而写出更优秀的代码。”
var a = 20;
alert(a 100);
a = null;
上面的三条语句,分别对应如下三个过程。
1、分配内存;
2、使用分配到的内存
3、不需要时销毁内存
1与2都好理解。这里主要讲下3.
javascript的垃圾回收主要是依靠"引用"的概念。当一块内存空间中数据能够被访问时,垃圾回收器会认为他是能够“被获得的”。不能够被获得的数据,就会被打上标记,并且被回收内存空间,这种方式叫做标记-清除算法。
更多专业前端知识,请上 【猿2048】www.mk2048.com
深入理解javascript系列(二):内存空间相关推荐
- 深入理解JavaScript系列(32):设计模式之观察者模式
介绍 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们 ...
- 深入理解JavaScript系列:《你真懂JavaScript吗?》答案详解
介绍 昨天发的<大叔手记(19):你真懂JavaScript吗?>里面的5个题目,有很多回答,发现强人还是很多的,很多人都全部答对了. 今天我们来对这5个题目详细分析一下,希望对大家有所帮 ...
- 深入理解JavaScript系列:闭包(Closures)
介绍 本章我们将介绍在JavaScript里大家经常来讨论的话题 -- 闭包(closure).闭包其实大家都已经谈烂了.尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭 ...
- 深入理解JavaScript系列(33):设计模式之策略模式(转)
介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很 ...
- 深入理解JavaScript系列(4):立即调用的函数表达式
前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下"自执行"这个叫法,本文对这个功能的叫 ...
- tom大叔blog--------深入理解javascript系列-----------笔记
之前一直收藏着tom大叔的blog,只是自己懒了下下...每个blog都像一个秘籍,每次看都有收获,也许自己道行太浅吧..不过还是很高兴,记下..也为了督促自己坚持下去... 一.深入理解JavaSc ...
- 深入理解JavaScript系列(5):强大的原型和原型链
前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大.实 ...
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...
- 深入理解JavaScript系列(27):设计模式之建造者模式
介绍 在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一 ...
- 深入理解JavaScript系列(33):设计模式之策略模式
介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很 ...
最新文章
- htmlcss基础知识点表单
- Android USB 开发详解
- Redux从设计到源码
- Python三维绘图--Matplotlib colorbar生成
- 【英语学习】【科学】【Glencoe Science】【A】Life's Structure and Function目录及术语表
- win7 oracle 冷恢复
- 聊聊 Material Design 里,阴影的那些事儿!
- 如何查看CentOS版本方法
- 【三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】
- linux磁盘满了怎么转移,linux 磁盘转移空间的方法
- 笔记本无线上网卡的种类
- VBA学习之一:基本知识
- HTML5主要针对什么进行优化,html5哪些标签可以优化SEO?
- 农耕ndows7 64位ado,Windows7 SP1下载-Windows 7 Professional VL SP1下载v7601.24496 64位中文精简版-西西软件下载...
- 大数据是什么意思?就业前景如何?
- 上海“富爸爸” 神奇投资之路
- ALLHIC使用 | HiC辅助基因组组装(三)
- ESP8266 基础篇:内存分布
- Python调用matlab及其配置方法
- 【20保研】2019年吉林大学软件学院优秀大学生暑期夏令营活动通知
热门文章
- 河海大学计算机考研难度大吗,河海大学考研难吗?一般要什么水平才可以进入?...
- 『python』业务案例实战-超市营业情况关键指标数据报表
- 软文1(含蓄,诙谐)
- SpringCloud之Eureka配置翻译
- 评价最小二乘法回归模型的优劣用什么方法?_解决多重共线性之岭回归分析
- Dropbox CEO MIT毕业典礼演讲:冒险精彩人生--转载
- Java 8 lambda语法将延用C#方式
- mysql的sql文什么意思_sql是什么,通俗的说,太专业听不懂?
- 测试人员的价值体现在哪里
- Tesseract-OCR:在Windows10(VS2019+SW)平台上的编译与使用