【有书共读08】JS核心技术开发解密读书笔记01
本贴对JavaScript核心技术开发解密一书第一至三章进行总结归纳。这里感谢BeLLESS,Charles,CiCi三位同学的笔记。
第一章 三种数据结构
1. 栈
- 特点:先进后出,后进先出
- 数组中的栈方法:
进栈:push(),返回数组长度
出栈:pop(),返回出栈的元素
let a = [] let b = [1,2] a.push(b)//注意此处a的值是[[1,2]],返回1 a.push(1)//a:[[1,2],1],返回2 a.pop()//a:[[1,2]],返回1
2. 堆
- 特点:树状结构,不需要特定的顺序就可以访问。在JS中可以用对象字面量体现
let a = { //堆是树状结构 name: 'xiaoming', age: 12 } console.log(a.age) //12,直接访问,不需要顺序
3. 队列
- 特点:先进后出
- 数组模拟队列的两种方法
shift() + push()
unshift() + pop()
let a = [] let b= [] //第一种 a.push(1,2) a.shift()//取出数组中的第一个元素,实现队列的先进后出 //第二种 b.unshift(1,2)//在数组开头插入元素 b.pop()//取出数组中的最后一项,实现队列的先进后出
第二章 内存空间
1. 基础数据类型与变量对象
类型 | 值 |
---|---|
Boolean | 只有两个值:true/false |
Null | 只有一个值:null |
Undefined | 只有一个值:undefined |
Number | 所有的数字 |
String | 所有的字符串 |
Symbol | ES6的新成员,一种独一无二的标记,避免属性命名时候的冲突 |
2. 引用数据类型与内存空间
需要注意的是,在JavaScript中是不允许直接访问堆内存中的数据,实际上操作的是对对象的引用而不是实际的对象,比如浅拷贝深拷贝,可以进行的操作是保存引用,然后进行值传递操作。
//基础类型复制 let a = 1 let b = a //b=1 b=2 //a=1,两个变量指向不同的地址,互不相关 //引用类型复制 let c = [1,2] let d = c //d=[1,2] d.push(3)//d=[1,2,3],c=[1,2,3]两个变量引用同一个地址,改变一个,另一个也会改变
3. 内存空间管理
- 自动垃圾回收机制:
标记清除法:当一块内存空间不能被获得数据,就会被标记清除。现在浏览器中都用的是标记清除,唯一的不同是垃圾收集时间间隔不同。
计数清除法:被引用次数为0就清除。 - 解除引用
局部作用域中,函数执行完成后局部变量会被自动回收;全局变量中只能用null来解除引用
第三章 执行上下文
执行上下文即是代码运行环境,存在于JS函数调用栈中,当栈顶调用完成后会自动出栈
1. JS运行环境
全局环境、函数环境、eval环境(不推荐使用)
2. 函数调用栈
下面通过两个例子说明下函数调用栈的执行规则
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
3. 生命周期
当调用一个函数的时候,就会创建一个执行上下文(也叫执行环境,或者环境),声明周期大致分成两个阶段:创建阶段和执行阶段
创建上下文:创建变量对象,确认作用于域链,确认this指向
执行上下文:变量赋值(值传递),函数引用,执行其他代码
执行完毕后,创建的内存等待被回收
#前端#