【有书共读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指向
执行上下文:变量赋值(值传递),函数引用,执行其他代码

执行完毕后,创建的内存等待被回收

#前端#
全部评论

相关推荐

看网上风评也太差了
投递万得信息等公司10个岗位 >
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务