一. this的绑定规则
1.1. 绑定规则
- 默认绑定
- 隐式绑定
- 显式绑定
- new绑定
1.2. 显式绑定
- apply/call
- bind
1.3. 内置函数的规则
- 经验
1.4. 规则的优先级
- new
- bind
- apply/call
- 隐式绑定
- 默认绑定
1.5. 规则之外的情况
- undefined/null
- 间接函数引用(了解)
二. 箭头函数的使用
2.1. 箭头函数的写法
-
基本写法
-
优化写法
- 只有一个参数时, 可以省略()
- 只有一行代码时, 可以省略{}
- 只要一行代码时, 表达式的返回值会作为箭头函数默认返回值, 所以可以省略return
- 如果箭头函数默认返回的是对象, 在省略{}的时候, 对象必须使用()包裹 () => ({name: "why"})
2.2. 箭头函数中的this
-
箭头函数是没有绑定this
-
this的查找规则:
- 去上层作用域中查找this
- 直到找到全局this
2.3. 箭头函数this应用
-
模拟网络请求
-
不好理解: 回调(好好理解一下)
- 函数传来传去
day 2
一. this的面试题
- 四种绑定规则
- 箭头函数不绑定this
二. debug华为商城
三. 浏览器的运行原理
3.1. 输入URL网页的请求显示的过程
3.2. 网页的渲染过程
- HTML解析 -> DOM Tree
- CSS解析 -> CSSOM Tree
- 生成 Render Tree
- 进行layout布局
- 进行paint绘制
3.3. 回流和重绘
-
如果需要重新布局
- 修改DOM
- 修改尺寸/位置
- ....
-
重绘
- 颜色/样式
-
回流一定会引起重绘, 尽量避免回流
- 一次性修改样式
- 减少DOM的操作
- 不要getComputedStyle获取位置和尺寸
- 可以使用绝对定位
- ....
3.4. 合成composite
-
默认文档流中的内容都是最终放到一个合成图层中
-
某些特殊的CSS属性, 会生成新的合成图层:
- position: fexied
- transform 3D
- will-change
- opacity在执行动画
- animation/transition执行transform
3.5. defer和async
-
script 会阻塞DOM Tree构建, 需要先下载/执行
-
defer
- 不会阻塞DOM Tree构建
- DOM Tree构建完成, 并且在DOMContentLoaded事件之前
- 保证多个defer的script顺序
- 从性能的角度最好放到head中
- defer对于script元素没有外部引用, 无效
-
async
- 独立下载独立运行
四. JavaScript的运行原理
4.1. V8引擎执行代码的流程
4.2. V8引擎其他内容补充
- 核心3个模块
- 词法分析/语法分析
4.3. ECMA文档的版本问题
day3
一. 深入JS执行原理
1.1. 全局对象的创建
1.2. 执行全局代码
1.3. 执行函数代码
1.4. 作用域作用域链
二. JS的内存管理
2.1. 内存管理的理解
2.2. GC实现算法
-
引用计数
-
标记清除(可达性)
-
V8本身的优化:
- 标记整理
- 分带处理
- 增量收集
- 闲时收集
2.3. 闭包的概念理解
2.4. 闭包的内存流程
2.5. 闭包的内存泄漏
day4
一. 函数增强
1.1. 函数对象的属性
- name
- length
1.2. arguments转数组
- 三种方式
- 箭头函数不绑定arguments
1.3. 剩余rest参数
- function foo(...args) {}
- args数组
1.4. 纯函数的使用
-
纯函数的概念:
- 确定的输入一定产生确定的输出
- 执行过程中不能副作用
-
实际开发中应用:
- react/redux
-
没有必要每一个函数都是纯函数
1.5. 柯里化的过程
-
什么是柯里化
-
柯里化函数
-
两个案例:
- logInfo
- makeAdder
-
柯里化优势:
- 职责单一
- 参数复用
-
自动柯里化的函数封装
1.6. 组合函数的使用
- 多个函数组合在一起, 以此调用
- 封装组合函数
二. 额外知识
2.1. with
2.2. eval
2.3. 严格模式
-
什么是严格模式?
-
如何开启严格模式:
- 文件开启
- 函数开启
-
严格模式的限制:
- 举一些例子
三. 对象增强
3.1. 属性描述符
3.2. 数据属性描述符
- configurable
- enumerable
- writable
- value
3.3. 存储属性描述符
- configurable
- enumerable
- get
- set
3.4. 定义多个属性描述符
Object.defineProperties(obj, {})
3.5. 额外方法的补充
day5
一. 原型的理解
1.1. 对象的原型
-
任何对象都有自己默认的原型(隐式原型)
-
作用: 在当前对象查找某一个属性时, 如果找不到, 会在原型上面查找
-
获取原型:
__proto__Object.getPrototypeOf(obj)
1.2. 函数的原型
-
任何一个函数(非箭头函数), 都有自己的prototype属性(函数的显式原型)
-
获取原型:
prototype
-
作用:
- 当通过new操作符调用函数时, 创建一个新的对象
- 这个新的对象的隐式原型会指向这个函数的显式原型
obj.__proto__ = F.prototype
1.3. 构造函数正确的写法
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.running = function() {}
var p1 = new Person()
p1.running()
1.4. 显式原型上的constructor
constructor默认指向函数对象本身
1.5. 重写显式原型
Person.prototype = {
}
// 注意: constructor
二. ES5中的继承
2.1. 面向对象的三大特性
- 抽象
- 封装
- 继承
- 多态
2.2. 原型链的概念
-
原型对象和原型对象之间可以形成链条
- 沿着我们的演练查找对应的属性
2.3. 原型实现继承
function Person() {}
function Student() {}
Student.prototype = new Person()
2.4. 借用构造函数
function Student() {
Person.call(this, ....)
}
2.5. 原型式/寄生式思想
2.6. 寄生组合式继承
function inherit(Subtype, Supertype) {
Subtype.prototype = createObject(Supertype.prototype)
}
function Person() {}
function Student() {}
inherit(Student, Person)
2.7. Object是最终的父类
2.8. 对象判断方法补充
- hasOnnProperty
- in/for in
- instanceOf
- obj.isPrototypeOf(info)
day6
一. 原型关系图(理解)
- function Person() {}
- function Object() {}
- function Function() {}
二. ES6类的使用(掌握)
2.1. class定义类
2.2. class类中的内容
- constructor方法
- 实例方法
- 访问器方法
- 静态方法 static
2.3. class的extends
-
extends关键字
-
super关键字
-
方式一: 构造方法 super()
- 一定在使用this之前以及返回对象之前先调用super
- 构造函数的首行
-
方式二: 实例方法super.method
-
方式三: 静态方法super.staticMethod
-
2.4. 继承自内置类
- 对内置类进行扩展
- Array.prototype.xxx
2.5. 类的混入Mixin
三. babel ES6转ES5源码(不强制要求)
3.1. 只写一个class类的源码
3.2. class的继承extends源码
day7
一. 面向对象的补充
1.1. 多态
-
严格意义的多态
-
JavaScript的多态
- 到处都是多态
1.2. 对象字面量的增强
- 属性的增强
- 方法的增强
- 计算属性名
1.3. 数组和对象的解构
- 基本使用
- 顺序
- 默认值
- ...
- 对象重命名
二. apply/call/bind实现
2.1. apply和call的实现
2.2. apply和call的封装
2.3. bind函数的实现
三. 额外知识补充
3.1. 新ECMA文档术语
3.2. var/let/const用法
3.2.1. let/const的基本使用
- 基本使用
- 注意事项: 不能重复定义
3.2.2. let/const有没有作用域提升
- 标识符在词法环境被创建时, 会被创建出来, 但是不能访问
- 作用域提升, 在作用域内, 可以被提前访问
3.2.3. 暂时性死区TDZ
3.2.4. 不会添加window
-
Global environment record:
- 合成的record
- window
- 声明式环境记录对象
3.2.5. 块级作用域和应用
-
let/const/class/function会形成块级作用域
-
let的块级作用域的应用
- btnEl的for循环
day8
一. ES6中的知识
1.1. 模板字符串
- 基本用法
- 标签模板字符串
1.2. 函数的增强
- 默认参数
- 剩余参数
- 箭头函数的注意事项
1.3. 展开运算符
- 对象字符串创建也可以使用展开运算符
1.4. 引用赋值/浅拷贝/深拷贝(重要)
1.5. 数字的连接符_
1.6. Symbol符号使用
- Symbol() 独一无二
- Symbol(description)
- Symbol.for
- Symbol.keyFor
1.7. Set/WeakSet
-
内容不能重复
-
WeakSet和Set区别
- 只能存放对象
- 对对象是弱引用
1.8. Map/WeakMap
-
key可以是对象类型
-
WeakMap和Map区别
- key必须是对象
- 对对象是弱引用
二. ES7~ES11知识点
2.1. ES7知识点
- includes
- **
2.2. ES8知识点
- Object.values()
- Object.entries()
- String - padStart/padEnd
- trailing commas
2.3. ES10知识点
- flat/flatMap
- Object.fromEntries
- trimStart/trimEnd
2.4. ES11知识点
-
BigInt -> n
-
空值合并运算符 ??
-
可选链的使用 ?.
- 函数调用也需要
day9
一. ES12和ES13知识点
1.1. ES12知识点
-
FinalizationRegistry
-
WeakRef
- objRef.deref()
-
逻辑赋值运算符
- ||=
- ??=
- &&=
-
replaceAll
1.2. ES13知识点
-
at
-
Object.hasOwn
- Object.prototype.hasOwnProperty
-
class成员
- public instance fields
- public static fields
- private instance fields
- private static fields
- static block
二. Proxy和Reflect
2.1. Proxy
2.1.1. Object.defineProperty
- 和Proxy区别
2.1.2. Proxy基本使用
- new Proxy(target, handler)
- 操作Proxy对象
2.1.3. Proxy捕获器
- set
- get
- has
- deleteProperty
- ....
2.1.4. apply/construct
2.2. Reflect
2.2.1. Object方法存在问题
2.2.2. 演示Reflect -> 返回值
2.2.3. Reflect和Proxy一起使用
- 1.不直接操作原对象
- 2.有返回值
- 3.改变访问器中的this指向
2.2.4. Reflect的construct用法
三. Promise使用
3.1. 异步代码存在困境
3.2. 使用Promise解决
3.3. Promise三种状态
3.4. resolve不同的值
3.5. then和catch方法补充
day10
一. Promise细节补充
1.1. 实例方法
1.1.1. then方法的返回新Promise
- then中的回调来决定
1.1.2. catch方法的返回新Promise
- catch执行, 前面某一个Promise reject执行
- catch返回值, catch传入的回调来决定
1.1.3. finally方法(ES9)
1.2. 类方法
1.2.1. all
- 等到所有的Promise有resolve结果, 拿到数组
- 如果过程中有一个reject, 那么all promise为reject
1.2.2. allSettled
- 等到所有的Promise都有结果, 拿到数组: [{ status: , value/reason }]
1.2.3. race
- 竞赛: 有一个有结果, 不管这个结果是fulfilled还是rejected
1.2.3. any
- 任意: 等到一个fulfilled, 如果都不是fulfilled生成一个错误对象
二. 迭代器Iterator
2.1. 什么是迭代器, 创建迭代器
-
本身是对象
-
实现next方法
- 返回 { done: false/true, value: value/undefined }
2.2. 什么是可迭代对象
- 函数: [Symbol.iterator]
- 返回: 迭代器
2.3. 迭代器类型
- 数组/String/Set/Map/argumetns/NodeList
2.4. 可迭代对象的特性
- JavaScript特殊语法: for of/spread syntax/yield* /解构
- 构造方法传值: new Set()
- 特殊的方法: Array.from/Promise.all()
2.5. 自定义类的可迭代对象
class {
[Symbol.iterator]() {
}
}
2.6. 迭代器的中断执行(了解)
三. 生成器Generator
3.1. 生成器函数和生成器对象
-
生成器函数:
- function *
- 返回生成器对象
- 内部可以通过yield控制函数的执行
-
生成器对象: 特殊的迭代器
3.2. 生成器的返回值和参数
3.3. 提前结束return/throw(了解)
3.4. generator替代iterator
-
createArray方法中
-
createRange方法
-
语法:
- yield*
-
自定义类中的替代
class {
*[Symbol.iterator]() {
yield* 可迭代对象
}
}
day11
一. generator异步处理
1.1. 处理一 - 回调地狱
1.2. 处理二 - Promise链式
1.3. 处理三 - generator+yield
1.4. 处理四 - await/async
1.5. 封装自动执行生成器函数工具
二. async/await
2.1. 异步函数async
2.2. 异步函数返回值
- 普通值: 包裹Promise
- Promise
- thenable
2.3. async中使用await
- await 表达式 -> Promise
- await后续的代码等到Promise有resolve结果时, 才继续执行
三. 事件循环/队列
3.1. 进程和线程
3.2. JavaScript单线程
3.3. 事件队列/循环
3.4. 宏任务/微任务
-
如何调度:
- 在执行下一个宏任务之前, 会清空微任务队列
3.5. 面试题: Promise/async/await
四. 异常处理
4.1. 异常的应用场景
4.2. throw抛出异常
- number/string/boolean
- 自定义对象
- new Error()
4.3. 捕获异常
try {
} catch(error) {
} finally {
}
day12
一. Storage
1.1. Storage的基本使用
1.2. Session和Local的区别
1.3. Storage的常见属性和方法
- length
- key()
- getItem
- setItem
- removeItem
- clear
1.4. 封装Cache
二. 正则表达式
2.1. 认识正则和JS创建
-
字符串匹配的利器
-
创建正则:
- new
- //
2.2. 正则常见的方法
-
正则方法
- exec
- test
-
字符串方法
- match
- matchAll
- search
- replace
- replaceAll
- split
2.3. 正则规则(自己总结)
2.4. 练习案例
2.4.1. 歌词解析(重要)
2.4.2. 时间格式化
三. 防抖基本使用
3.1. 认识防抖
- 搭建案例
3.2. underscore实现防抖
- 通过CDN引入文件
- _.debounce(fn, 2000)
day13
一. 防抖和节流
1.1. 防抖实现
- 基本实现
- this和参数的绑定
- 立即执行
- 取消功能
- 返回值
1.2. 节流实现
- 基本实现
- this和参数的绑定
- 立即执行
- 尾部执行
- 取消功能
- 返回值
二. 深拷贝和事件总线
2.1. 深拷贝
-
引用赋值/浅拷贝/深拷贝的区别和关系
-
JSON实现深拷贝
-
实现深拷贝
-
基本实现(递归)
-
数组类型
-
其他类型处理
-
Set
-
函数
-
Symbol
- key
- value
-
-
循环引用
- WeakMap
-
2.2. 事件总线
-
class HYEventBus
-
方法
- on(eventName, eventFn)
- emit(eventName, ...args)
- off(eventName, eventFn)
day14
一. 服务端渲染和前后端分离
1.1. 服务器端渲染
1.2. 前后端分离
二. HTTP协议
2.1. HTTP介绍
2.2. HTTP组成
-
请求request
- 请求行
- 请求头
- 请求体
-
响应response
- 响应行
- 响应头
- 响应体
2.3. 协议版本
2.4. HTTP请求方式
- GET/POST/PUT/DElETE/PATCH
2.5. http request header
- Content-Type
2.6. response status code
- 200
- 201
- ....
三. Chrome插件安装
四. XMLHttpRequest
4.1. 基本使用过程
4.2. 监听onreadystatechange
- 不同状态
- 发送同步请求
- 其他监听方法
4.3. 响应的类型和数据
- responseType = "json"
- response
4.4. 获取响应码
- response.status
- response.statusText
4.5. 服务器传递参数
- 方式一: get query
- 方式二: post urlencoded
- 方式三: formdata
- 方式四: json
4.6. ajax的封装
- 基本封装
- 各个参数
- 返回Promise回调
4.7. timeout和abort
五. Fetch
3.1. Fetch的基本使用
3.2. Fetch的代码优化
- Promise的then中return
- await/async的写法