感谢牛客组织这样一个活动满足广大学子的要求,既可以不用花钱就能看书,又可以互相监督学习。
第一章 三种数据结构
JavaScript中,有三种常用的数据结构是我们必须了解的,它们分别是栈、堆和队列。
——阳波
其中,栈是一种后进先出的存取方式。我们用数组模拟栈的行为。首先看入栈。
// 入栈push方法,push方法返回数组修改后的长度
var a = [];
a.push(1); // a = [1]
a.push(2, 4, 6); // a = [1, 2, 4, 6]
var l = a.push(5); // a = [1, 2, 4, 6, 5], l = 5
接着再看出栈。
// 出栈pop方法,pop方法返回数组末尾被删除的元素
var a = [1, 2, 3];
a.pop(); // 3, a = [1, 2]
堆数据结构通常是一种树状结构,它的存取方式跟变量存放的顺序无关。这里我们用字面量对象的形式来体现堆。
var heap = {
a: 10,
b: 20,
c: {
m: 100,
n: 110
}
}
console.log(heap.a); // 10
我们再获取a的值时,只需通过heap.a即可,不关心a,b,c的具体顺序。
队列是一种先进先出的存取方式。我们同样用数组模拟队列的行为。首先看入队,由于入队与入栈方法一样,这里不进行过多解释。我们直接看出队。
// 出队shift方法,shift方法返回数组开头被删除的元素
var a = [1, 2, 3, 4, 5];
a.shift(); // 1, a = [2, 3, 4, 5]
第二章 内存空间
1. 基础数据类型与变量对象
ps:书上说最新的ECMAScript标准号定义了7种数据类型,其中包括六种基本数据类型与一种引用数据类型Object。这里感觉应该纠正下,是三种引用类型,分别是Array,Function,Object。
类型 | 值 |
---|---|
Boolean | 只有两个值:true/false |
Null | 只有一个值:null |
Undefined | 只有一个值:undefined |
Number | 所有的数字 |
String | 所有的字符串 |
Symbol | 符号类型:var sym = Symbol('testsymbol') |
函数运行时,会创建一个执行环境,这个执行环境叫做执行上下文(Execution Context,EC),在执行上下文中,会创建一个叫作变量对象(VO)的特殊对象,基础数据类型往往都保存在变量对象中。
——阳波
2. 引用数据类型与堆内存空间
引用数据类型的值时保存在堆内存空间中的对象。在JavaScript中,不允许直接访问堆内存空间中的数据,因此不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。
function foo () {
var a1 = 10;
var a2 = 'hello';
var a3 = null;
var b = {m: 20};
var c = [1, 2, 3];
}
变量对象地址指针
基本类型的值复制之后,改变其中一个的值,不会影响另一个,但是引用类型的值不行。
// 基本类型值复制后改变不影响其他值
var a = 20;
var b = a;
b = 30;
console.log(a); // 20
console.log(b); // 30
// 引用类型值复制后改变会影响其他值
var m = {a: 10, b: 20};
var n = m;
n.a = 15;
console.log(m); // {a: 15, b: 20}
console.log(n); // {a: 15, b: 20}
3. 内存空间管理
因为自动垃圾回收机制的存在,使得我们在开发时好像并不用那么关心内存的使用问题。内存的分配与回收完全实现了自动管理。了解内存机制有助于自己更清晰地认知到自己写的代码在执行过程中都发生了什么,从而写出性能更加优秀的代码。
——阳波
鉴于这里我理解的不是很好,套用书上的例子。
var a = 20; // 分配内存
alert(a + 100); // 使用分配到的内存
a = null; // 不需要时释放内存
第三章 执行上下文
1. 函数调用栈的执行规则
JavaScript中的运行环境主要包括以下三种情况:
全局环境:代码运行起来后会首先进入全局环境
函数环境:当函数被调用执行时,会进入当前函数中执行代码
eval环境:不建议使用,这里不做介绍
JavaScript引擎会以栈的方式来处理它们。栈底永远是全局上下文,栈顶则是当前正在执行的上下文。
下面通过两个例子说明下函数调用栈的执行规则。
var color = 'blue';
function changeColor () {
var anotherColor = 'red';
function swapColors () {
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColors();
}
changeColor();
下面是一个简单的闭包例子,永远记住函数执行时才会创建执行上下文。
function f1 () {
var n = 999;
function f2 () {
alert(n);
}
return f2;
}
var result = f1();
result(); // 999
2. 生命周期
一个执行上下文的生命周期大致可以分为两个阶段:创建阶段和执行阶段。
创建阶段:
在这个阶段,执行上下文会分别创建变量对象,确认作用域链,以及确定this的指向。
执行阶段:
创建阶段之后,就开始执行代码,这个时候会完成变量赋值、函数引用,以及执行其他可执行代码。
以上是我对JavaScript核心技术开发解密第一至三章的读书笔记,码字不易,请尊重作者版权,转载注明出处。
By BeLLESS 2018.6.16 02:23
网友评论