学习计划
注:
- 早(7:00-11:00)
- 午(13:30-16:00)
- 晚(19:00-23:00)
第一周
| 日期 | 早 | 午 | 晚 | 复习内容 | 完成度 |
|---|---|---|---|---|---|
| 6月28日 | 自动阅读插件 | 点击与拖拽分离 | 双击事件 | 事件代理 | 80% |
| 6月29日 | 输入及状态改变事件 | 实战京东搜索框 | 解决事件代理和鼠标移动事件的窘态 | innerHTML/Text | 100% |
| 6月30日 | 实战鼠标行为预测技术 | 实战电商网站商品图片放大镜效果 | 键盘事件、贪吃蛇运动原理 | 鼠标事件 | 100% |
| 7月1日 | JSON基础 | 数据解析&AJAX初识 | 实战模板渲染、缓存数据、案例 | 页码距离,滚动距离,事件绑定 | 100% |
| 7月2日 | 实战前端缓存数据设计、前端缓存池 | 实战带搜索功能的课程选项卡 | 转义符号与字符、正则基础、修饰/元字符 | JSON和缓存池 | 100% |
| 7月3日 | 正则量词、属性、方法、使用技巧 | match/exec、toString/valueOf、封装typeof | 正向预查、贪婪与非贪婪模式、replace方法 | 正则基础 | 70% |
| 7月4日 | 实战正则实例集合、不捕获分组 | 用正则进行模板替换的方法 | 复习 | 复习 | 100% |
知识整理:
mousedown: mouseover + mouseuponinput&onpropertychange:只要在输入框中填写或删除内容,里面显示内容onchange:获得输入框失去焦点后的文本内容,若不更改值,失去焦点不会变化滑入滑出
onmouseover&onmouseout:存在冒泡现象,影响子元素mouseenter&mouseleave:只对被绑定元素进行事件触发,存在类似冒泡现象,也影响子元素keydown&keypress区别:keydown没有charCode但有keyCodekeypress有charCode和keyCode
JSON.parse()将JSON字符串转换成JSON对象JSON.stringify()将JSON数据转为字符缓存池:请求过的数据不再去请求,只要请求过一次就会缓存到前端,以便于减轻服务器的压力
前端做数据缓存有以下方法:
localStrogesessionStrogecookies- JS脚本(适用于更新不太频繁的情况)
特殊的转义字符:
\n:换行\r:回车\t:制表符
修饰符
i:igore case 忽略大小写g:global 全局匹配m:multi-line 多行匹配
表达式
[]:区间^:非|:或
元字符:即正则使用的转义符号
\w:[0-9A-z_]\W:[^\w]非\w区间的所有字符\d:[0-9]digit 数字\D:[^\d]非数字\s:[\r\n\t\v\f]->[回车\换行\制表\垂直\换页]\S:[^\s]\b: 单词边界\B: 非单词边界.: 可以匹配除了回车和换行的所有字符
量词
n+:{1, 正无穷}出现1次到正无穷n*:{0, 正无穷}出现0次到正无穷n?:{0, 1}出现0次到1次
正则对象属性
reg.global:判断是否用greg.ignoreCase:判断是否用忽略大小写ireg.multiline:判断是否用换行mreg.resource:正则本体,如/(\w)/reg.lastIndex:查到跟exec()执行后类数组里面的index一样的值,可更改值,还能调整下标
正则对象方法
reg.test(str):判断是否能匹配出来reg.exec():执行
正向预查:匹配一个字符串,但有条件,字符串后面指定一个特定的字符或者字符串
子表达式/反向引用:子表达式有记忆匹配内容,反向引用第几位子表达式
贪婪/非贪婪模式:
- 能匹配多,不匹配少(贪婪)
- 能匹配少就不匹配多(非贪婪)
重难点:
如何在事件代理的情况下获取下标?
- indexOf
- 事件源对象的tagName筛选冒泡对象
也可以通过for循环拿到下标
事件流的三个阶段:
- 事件捕获阶段(默认不执行)
- 处于目标阶段(触发时候) -> 执行事件处理函数
- 事件冒泡阶段
第二周
| 日期 | 早 | 午 | 晚 | 复习内容 | 完成度 |
|---|---|---|---|---|---|
| 7月5日 | 实战正则实例集合、不捕获分组 | 用正则进行模板替换的方法 | 考试 | 正则案例 | 100% |
| 7月6日 | 服务器搭建与相关操作,网络初探、URL、 | 客户端与服务端、域名操作 | DNS、IP、TCP/UDP、HTTP/HTTPS、三次握手 | 模板替换方法 | 90% |
| 7月7日 | www历史、HTTP报文、请求方式、GET与POST | http状态码、accept、Content-Type | 缓存、长短连接、Content-Length、referrer | 三次握手 | 100% |
| 7月8日 | http版本、关闭TCP、四次挥手、同源策略 | 减少HTTP请求的方法 | 同步与异步请求、混编、AJAX、原生AJAX封装 | 报文字段 | 100% |
| 7月9日 | 实战AJAX之『腾讯课堂评论模块』 | 实战AJAX之『腾讯课堂评论模块』 | 实战AJAX之『腾讯课堂评论模块』 | 三次握手 | 100% |
| 7月10日 | AJAX版本、响应状态、超时设置、同步与异步 | 6种跨域获取数据的方法 | JSONP跨域之『百度联想词搜索』 | 四次挥手 | 90% |
| 7月11日 | JSONP跨域之『百度联想词搜索』 | 复习 | 复习 | 复习 | 80% |
知识整理:
Client客户端 -DNS解析> IP地址 -TCP/IP三次握手> Sever服务端
三次握手:请求连接时需要三次握手
四次挥手:中断连接请求都需要4次往返的数据传输
URI:同一资源标识符,用来唯一的标识一个资源
URL:统一资源定位符,URL可以用来标识一个资源,而且还指明了如何定位这个资源用地址定义一个资源
URN:统一资源命名,通过名字来表示资源的,用名称定位一个资源
URL 和 URN 是 URI 的子级
DNS解析:域名与对应ip转换的服务器
DNS解析顺序:根 > .comjspp > 域名 > 二级域名
TCP标志位:数据包
- SYN:Sychronize Sequence Numbers 同步序列编号
- ACK:Acknowledgement 确认字符
状态:
- LISTEN:侦听TCP端口的连接请求
- SYN-SENT:在发送连接请求后等待匹配的连接请求
- SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认
- ESTABLISHED:代表一个打开的连接,数据可以传送给用户
UDP:User Data Protocol 用户数据报协议
UDP应用场景:无需确保通讯质量且要求速度快,无需确保信息完整
HTTP是不安全的(监听和中间人攻击等手段,获取网站账户信息和敏感信息)
HTTP协议的传输内容都是明文,直接在TCP连接上运行,客户端和服务器都无法验证对方身份
HTTPS协议的传输内容是被SSL/TLS加密, 且运行在SSL/TLS上,SSL/TLS运行在TPC连接上,所以数据传输是安全的
报文组成
- 对报文进行描述的起始行
- 包含属性的首部/头部(header)
- 包含数据的主体(body)(可选项)
报文请求方式:
- GET/POST
- OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法
- HEAD:返回与GET请求相一致的响应,响应体被返回
- PUT:向指定资源位置上传其最新内容(form表单不支持)
- DELETE:请求服务器删除request-URI所标识的资源(form表单不支持)
- TRACE:回显服务器收到请求,主要用于测试或诊断
- CONNECT:连接改为管道方式的代理服务器
GET主要用来获取数据
GET的数据在请求体中是查询字符串参数(Query String Parameters)
POST主要用于传输数据到后端进行增加,删除,更新数据,提交表单
POST的数据在请求体中是表单数据(Form Data)
GET过程:
- 第三次握手,浏览器确认并发送请求头和数据
- 服务器返回200 OK响应
- GET会进行数据缓缓,POST不会
Etag:服务端资源唯一标识符(优先级高于Last Modified)
Last-modified:资源在服务器最后修改的时间(精确到秒) -> 所以需要唯一标识符
- 第一次访问index.html(响应头) - 200 OK
- 第二次访问 index.html(请求头) - 304 Not Modified
- 第三次访问index.html(响应头) - 200 OK
Pragma:no-cache(http1.0) 指示浏览器忽略资源缓存副本,每次访问需要到服务器获取
Cache-Control缓存控制(响应头)
- no-cache:指示浏览器忽略资源缓存副本,强制到服务器获取资源(浏览器依旧缓存)
- no-store:强制缓存再任何情况下都不要保留任何副本
- max-age=31536000:指示缓存副本的有效时长,从请求时间开始到过期事件之间的秒数
- public:表明响应可以被任何对象(包括:发送请求的客户端,代理服务器等)缓存
- private:表面响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)
HTTP短连接与长连接
- 默认开启:Connection: keep-alive
- 如需关闭:Connection: close
四次挥手:
- FIN:finish关闭连接 数据包
- FIN-WAIT-1:等待原创TCP的连接中断请求,或先前的连接中断请求的确认
- FIN-WAIT-2:从远程TCP等待连接中断请求
- CLOSE-WAIT:等待从本地用户发来的连接中断请求
- LAST-ACK:等待原来发向远程TCP的连接中断请求的确认
- TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
- CLOSED:没有任何连接状态
重难点:
四次挥手过程:
- 连接建立状态
一次挥手:
- 客户端 -> 服务器:发送连接关闭报文
- 报文首部:FIN-1
- 序列号 seq = u
- 客户端状态为FIN-WAIT-1
二次挥手:
- 服务器 -> 客户端:收到连接关闭报文,并发送确认报文
- 报文首部:ACK = 1 ack = u + 1(确认FIN)
- 序列号 seq = v
- 服务器状态为CLOSE-WAIT(连接半关闭状态)
- 客户端进入等待2状态FIN-WAIT-2
三次挥手:
- 服务器 -> 客户端:确认数据已发送完毕后,继续发送连接关闭报文
- 报文首部:FIN = 1 ACK = 1 ack = u + 1(确认上一次数据包)
- 序列号 seq = w
- 服务器进入最后确认状态LAST-ACK
四次挥手:
- 客户端 -> 服务器:发送接收确认报文
- 报文首部:ACK = 1 ack = w + 1(确认上一次数据包)
- 序列号 seq = u + 1
- 进入时间等待状态TIME-WAIT
- 服务器进入TCP关闭状态CLOSE
第三周
| 日期 | 早 | 午 | 晚 | 复习内容 | 完成度 |
|---|---|---|---|---|---|
| 7月12日 | 6种跨域获取数据的方法 | 6种跨域获取数据的方法 | 实战JSONP跨域之『百度联想词搜索』 | 页面渲染 | 100% |
| 7月13日 | JSONP跨域之『豆瓣网音乐搜索』 | JSONP跨域之『豆瓣网音乐搜索』 | iframe实用之网页导航、代码编辑器 | 回流重绘 | 100% |
| 7月14日 | cookie增删改查、用户追踪 | cookie+token实现网站『持久登录』 | cookie+token实现网站『持久登录』 | 时间线 | 100% |
| 7月15日 | AJAX之『大附件文件上传功能』 | AJAX之『大附件文件上传功能』 | AJAX之『后台列表管理模块』 | 渲染引擎 | 100% |
| 7月16日 | AJAX之『后台列表管理模块』 | AJAX之『瀑布流』 | AJAX之『瀑布流』 | JS执行机制 | 100% |
| 7月17日 | AJAX之『瀑布流』 | 网站手机验证码注册模块实战 | 网站手机验证码注册模块实战 | 异步加载 | 100% |
| 7月18日 | 复习 | 复习 | 复习 | 复习 | 90% |
知识整理:
页面渲染机制:
domTree解析 :
- domTree 树型结构 ,解析引擎将html结构转为树形结构
- DOM树满足一个深度优先解析的原则
- DOM树构建是html元素节点的解析
- DOM树不管内部资源的问题
domTree加载:
- 解析的过程伴随着加载的开始
- 先有了解析才会有加载
- 解析和加载异步完成的
CSS树:
- 也满足深度优先
- 会忽略浏览器不能识别的样式
渲染树:
- 渲染树每个节点都有自己的样式
- 不包含隐藏节点(
display: none, head之类不需要绘制的节点) - 包含影响布局的样式都要绘制(
visibility: hidden) - 渲染树上的每一个节点都会被当作一个具有内容填充,边距,边框,位置,大小等其他样式的盒子
回流时,浏览器会重新构建受影响部分的渲染树,渲染树一旦被改变或重新构建一定会引起重绘。
引起回流的因素:
- DOM节点增加,删除
- DOM节点位置变化
- 元素的尺寸,边距,填充文字/图片,边框,宽高
- DOM节点
display显示或隐藏 - 页面的渲染初始化
- 浏览器窗口变化
- 向浏览器请求某些样式信息
offset/scroll/client/width/height/getComputeStyle()/currentStyle
优化:要考虑回流次数的问题
优化:要考虑涉及节点数量
时间线:在浏览器加载页面开始的那一刻到页面加载完全结束的这个过程中,按顺序发送的每一件事情的总流程
页面加载三个阶段
document.readyState = 'loading'document.readyState = 'interactive'document.readyState = 'complete'
window.onload与DOMContentLoaded的区别:文档解析完成后立马触发DOMContentLoaded事件,而window.onload是等到页面加载完成时才触发,所以不用window.onload是因为浪费时间渲染引擎: 内容具备一套绘制图像方法集合,渲染引擎可以让特定的方法执行,把HTML/CSS代码解析成图像显示再浏览器窗口中
浏览器渲染引擎进程(浏览器内核)是多线程的:
- JS引擎线程(单线程)DOM冲突
- GUI线程(互斥)
- http网络请求程序 webAPIs
- 定时器触发线程
- 浏览器事件处理线程
数据量大会怎样?
- 方法一:SSR服务端计算,前端渲染
- 方法二:webworker
- JS运行原理:JS引擎线程(单线程),同时执行异步执行(事件驱动)
重难点:
时间线:
- 生成document对象(JS起作用)
- 解析文档,构建DOM树,
document.readyState = 'loading',页面加载第一阶段:加载中 - 遇到link标签会新开线程异步加载css外部资源文件,style开始构建CSS树
- 没有设置异步加载的script标签,阻塞文档解析,等待JS脚本加载并执行完成后,继续解析文档
- 异步加载script,异步加载JS脚本并执行,不阻塞解析文档,不能使用
document.write() - 解析文档遇到img先解析这个节点 ,创建加载线程,异步加载图片资源,不阻塞解析文档
- 文档解析完成且可以交互,
document.readyState = 'interactive',页面加载第二阶段:解析完成 - 文档解析完成后立马defer script JS脚本开始按照顺序执行
- 文档解析完成后立马触发DOMContentLoaded事件,可以监控文档解析完成(不等于文档加载完成)时间,同步程序的脚本执行阶段往事件驱动阶段
- async script加载并执行完毕,img等资源加载完毕,window对象中的onload事件才触发,
document.readyState = 'complete',页面加载第三阶段:页面加载完成
第四周
| 日期 | 早 | 午 | 晚 | 复习内容 | 完成度 |
|---|---|---|---|---|---|
| 7月19日 | ES6版本过渡历史 | 块级作用域与嵌套、let、暂行性死区 | let进阶、const、全部变量与顶层对象 | let,const | 100% |
| 7月20日 | 解构赋值、函数默认值、数组解构、对象解构 | 隐式转换、函数参数解构、解构本质、()用法 | this指向、箭头函数基本形式、rest运算符 | 箭头函数,展开运算符 | 100% |
| 7月21日 | 箭头函数的实质、箭头函数的使用场景 | 函数名/对象拓展、描述符、getter/setter | 对象密封4种方式、assign、取值函数的拷贝 | 属性描述符 | 80% |
| 7月22日 | super、4种遍历方式、原型、symbol遍历 | Symbol、iterator、forOf、typeArray | array/数值拓展、ArrayOf、ArrayFrom | symbol,遍历 | 90% |
| 7月23日 | 正则方法、修饰符yus、UTF_16编码方式 | Unicode表示法、字符串方法、模板字符串 | map与set | 迭代器 | 90% |
| 7月24日 | WeakMap与WeakSet、proxy与reflect | class与对象 | 异步的开端-promise | map,set | 90% |
| 7月25日 | 复习 | 复习 | 复习 | 复习 | 70% |
知识整理:
let特点:同一作用域下,let不允许重复声明
let特点:不会声明提升,会产生一个暂时性死区
let特点:只能再当前的块级作用域下生效
块级作用域:是没有返回值的
const特点:定义的常量必要要赋值
const特点:一旦定义必须赋值,值不能被更改
const特点:有块级作用域,存在暂时性死区
const特点:常量不能重复声明
const只保证指针地址没错,但不保证地址里数据内容不被更改
形参默认值会影响函数内声明造成重复声明报错
里层声明时拿不到父级作用域的变量会报错
惰性求值:当函数的参数为表达式的时候,会重新计算表达式的值
解构赋值依然是一个赋值的过程
变量多,值少的情况以undefined填充
对象的解构是不存在顺序的
箭头函数this指向 由外层函数的作用域来决定的
箭头函数不能作为构造函数来使用
箭头函数没有arguments对象,用rest(拓展运算符替代)
箭头函数yield 命令不能生效,在generator 函数中
箭头函数没有this机制,指向是固定的
箭头函数在定时器内部可以通过闭包访问父级作用域的属性
适合箭头表达式的情况:
- 返回值单一,只有唯一的表达式,函数内部没有this引用
- 递归
- 事件处理函数绑定/解绑
- 内层的函数表达式需要调用this,用
var _self = this;bind(this)确保适当的this指向时 var args = Array.prototype.slice.call(arguments)用箭头函数比较好
不适合箭头表达式的情况:
- 函数声明,执行语句比较多的
- 还需要用到递归
- 还需要引用函数名
- 事件绑定,解绑定
展开运算符:收集实参得到的是数组而不是类数组
展开运算符:展开实参得到的是单独的值
展开运算符不能通过length属性访问,只能访问实际实参的长度
属性描述符可以检测属性特征的方法
getter/setter:获取属性赋值操作
symbol值解决对象属性名重名
for in:遍历自身和继承的可枚举属性(不包括含Symbol类型的值)Object.key():遍历自身不包含Symbol类型的值Object.getOwnPropertySymbols():遍历自身的Symbol类型的值Object.assign():遍历自身可枚举的,包含Symbol类型的值JSON.stringify():遍历自身可枚举的属性迭代器是一种有序的,连续的,基于拉取的一种消耗数据的组织方式
具有部署迭代器接口的数据结构有:Array/Map/Set/weekMap/weekSet/arguments/nodeList
for of为了解决迭代器iterator().next()调用繁琐而新增的APIArray.from()将数组/类数组/部署迭代器接口的对象转化成真正的数组Array.of()使用指定的参数作为定义数组里的数组元素Object.keys():遍历出自身的可枚举的键名(不含继承属性)Object.values():遍历出自身的可枚举的键值(不含继承属性)Object.entries():遍历出自身的可枚举的键值对(不含继承属性)super指向的是对象的原型对象
Map()存放的是对象,有键名和键值,且键名不限于字符串,也可以是对象,也可实现一一对应的关系Set成员唯一的数组extends关键字:实现继承关系
重难点:
Promise异步操作的特征
特征一:具有共有的状态,且状态不受外界影响
- 进行中 - pending
- 已成功 - fullfilled(resolve)
- 已失败 - reject
特征二:状态的不可逆性
- promise固化以后,再对promise对象添加回调,是可以直接拿到结果的
- 如果是事件的话,一旦错过就错过了
宏任务队列/微任务队列:在JS异步代码中,存在宏任务队列和微任务队列
- 宏任务:定时器
- 微任务:resolve/reject()的回调函数then()
同步任务 -> 事件轮巡 -> 主线程全部任务完成 -> 调用任务队列当中的回调函数推入到执行栈中,存在优先权的问题:
- 微任务/微任务中的回调函数先执行(then())
- 再执行宏任务
第五周
| 日期 | 早 | 午 | 晚 | 复习内容 | 完成度 |
|---|---|---|---|---|---|
| 7月26日 | JavaScript模块化 | JavaScript模块化 | 生成器与迭代器的应用 | 生成器 | 90% |
| 7月27日 | 插件组件模块化开发 | 手写简化版requireJS | commonJS_ES6module | 迭代器 | 100% |
| 7月28日 | 商城购物车项目模块实战 | 商城购物车项目模块实战 | 商城购物车项目模块实战 | requireJS | 100% |
| 7月29日 | 商城购物车项目模块实战 | 商城购物车项目模块实战 | 商城购物车项目模块实战 | async/await | 100% |
| 7月30日 | JS函数、特点、函数式编程初识、纯函数 | 课程搜索案例(函数提纯) | 函数组合、结合律、pointfree、实用案例 | promise | 100% |
| 7月31日 | 高阶函数、函数柯里化、封装柯里化函数 | 偏函数、偏函数与柯里函数的区别、惰性函数 | 函数防抖、函数节流、防抖和节流的应用 | 组件、插件 | 85% |
| 8月1日 | 复习 | 复习 | 复习 | 复习 | 80% |
