第一章:Day 1
问题 1:HTML5 新特性有哪些
- 语义化标签
- header
- footer
- aside
- nav
- article
- section
- history API:
- history.pushState()
- history.replaceState()
- history.back()
- history.forward()
- history.go()
- history.state
- WebSocket
- new webSocket(), socket.on 赋值给监听事件
- socket.send/close/message/error
- 本地存储
- localStorage
- sessionStorage
- cookie
- 地理接口
- navigator.geolocation
- audio/video
- webGL(Web 图形库)/canvas
- requestAnimationFrame
- 表单控件:calendar、date、time、email、url、search
- 拖放 API:
- draggable
- ondragstart
- ondrag
- ondragenter
- ondragleave
- ondragover
- ondrop
- ondragend
- Web Worker:后台执行耗时计算、数据处理、图像处理
- 与 Service Worker 的区别:离线缓存、消息推送、后台同步、拦截请求
问题 2:HTTP 状态码
- 2xx:成功
- 200 OK:请求成功
- 201 Created:请求成功并创建了新的资源
- 204 No Content:请求成功但没有资源返回
- 3xx: 重定向
- 301 Moved Permanent:永久重定向
- 302 Found:临时重定向
- 304 Not Modified:资源未修改,使用缓存
- 4xx:客户端错误
- 400 Bad Request:请求错误
- 401 Unauthorized:未授权
- 403 Forbidden:禁止访问
- 5xx:服务器错误
- 500 Internal Server Error:服务器错误
- 502 Bad Gateway:网关错误
问题 3:正则表达式的用法?
问题 4:HTML5 语义化的优点
问题 5:介绍下 304 过程
问题 6:数组的常用方法有哪些?
问题 7:CSS 选择器及优先级
问题 8:强缓存和协商缓存
问题 9:== 和 === 区别
问题 10:script 标签放在 header 里和放在 body 底部里有什么区别?
- 放在
<header>里面: 在浏览器解析到<script>的时候,会立即执行 js 代码- 可能遇到 "undefined" 或 "null": js 里有修改或访问 dom ,而此时未解析 body 形成 dom
- 解决:在事件 document.addEventListener("DOMContentLoaded", function() {})
- 影响用户体验:脚本过大,网络请求,会阻塞页面的渲染
- 可能遇到 "undefined" 或 "null": js 里有修改或访问 dom ,而此时未解析 body 形成 dom
- 放在
<body>底部- 用户体验上可以先看到页面,再去加载 http 请求
- js 里有修改 dom 的操作,也不会出错
延伸:什么情况会阻塞页面的渲染?
- HTML 解析阻塞:遇到
<script>(不含 "defer" 或 "async" 属性) - CSS 解析阻塞
- JavaScript 阻塞 CSSOM 构建
第二章:Day 2
问题 1:HTTP1、HTTP2、HTTP3 的区别
- HTTP1
- HTTP 1.0
- 1.0 每次请求都会建立一个 TCP 连接,请求完毕后就会断开
- HTTP 1.1
- 1.1 持久连接
- 1.1 浏览器对每个域名的最大并发连接数为 6 个 TCP 连接
- 分块机制(chunk transfer)
- 如果某些块丢失了怎么办?: 底层协议 TCP 有错误检测机制和重传机制
- CDN 分片
- HTTP2(从上往下:HTTP2->TCP->二进制分帧->IP)
头部压缩
头部压缩的必要性:客户端发送 HTTP 到服务端获取数据的时候,body 很多时候是空的
HPACK 算法: 客户端和服务端同时维护头部信息表,对于同样的头部信息只需要发送索引,减少重复传输
静态表:固定字典 例如:
content-type: application/json,发送方和接收方事先约定好动态表:可变的字典,发送方和接收方各自维护。固定大小,超过大小会淘汰最早的
队头阻塞:等待前面的请求完毕才会继续请求
服务器推送
多路复用: TCP 并发请求,建立多个管道
二进制分帧实现多路复用
发送时通过 二进制分帧层 处理,输出 带有流标识符(Stream Identifier)的帧
服务器解析根据流标识符(Stream Identifier)识别对应请求/响应
接受时通过 二进制分帧层 解析,输出到浏览器
浏览器根据 ID 交给对应的请求
分层 HTTP2 二进制分帧层 TLS(Transport Layer Security 传输层安全性) (可选) TCP IP
思考🤔: HTTP2 一定比 HTTP1.1 快吗?
- 当丢包率很高的时候,HTTP2 比 HTTP1.1 慢
- HTTP2 的队头阻塞: 是多个请求共用一个 TCP 连接,如果一个请求丢包了,那么这个 TCP 连接就会被阻塞,其他所有请求也会被阻塞
- HTTP1.1 是建立6个 TCP 连接,如果一个请求丢包了,那么这个 TCP 连接就会被阻塞,其他5个请求不会被阻塞

- HTTP3
QUIC 协议:由于 UDP 不可靠,该协议可以保持
实现了 TCP 流量控制,传输可靠的功能。提供了数据包重传,拥塞控制
TLS 加密
多路复用
快速握手
UDP: 免去三次握手、四次挥手操作
QUIC 利用 UDP 的无连接特性,实现了快速握手,避免了 TCP 的慢启动(三次握手、四次挥手)
UDP 特性:不需要连接,直接发送数据包,不需要等待确认
彻底解决队头阻塞问题
从物理连接上独立的逻辑数据流
分层 HTTP3 QUIC(多路数据流、快速握手、TLS、可靠性、有序交付) UDP IP
总结

问题 2:async
问题 3:CSS3 新特性
问题 4:加密算法
问题 5:JS 中的 8 种数据类型及区别
问题 6:position 属性的值有哪些及其区别
问题 7:GET 与 POST 的区别
问题 8:var, cosnt, let 三者之间的区别
问题 9:CSS 盒子模型
问题 10:WebSocket
第三章:Day 3
问题 1:BFC(块级格式上下文)
问题 2:Socket 连接的步骤
问题 3:数据类型判断 instanceof 和 typeof 的区别
问题 4:隐藏页面元素的方法
问题 5:DNS 协议是什么?
问题 6:深拷贝浅拷贝的区别
问题 7:Flex 布局
问题 8:浏览器的主要功能
问题 9:闭包
问题 10:Rem 布局
第四章:Day 4
问题 1:浏览器是如何渲染 UI 的?
问题 2:浏览器重绘与回流
问题 3:百分比布局
问题 4:重绘与重排的区别?
问题 5:行内元素、块级元素、空元素
问题 6:浮动布局
问题 7:Cookie、sessionStorage、localStorage 的区别
问题 8:获取表单元素的事件
问题 9:em/px/rem/vh/vw 区别?
问题 10:WEB 攻击
~~1. CSRF(跨站脚本攻击): 例如在一个页面中弹出一个图片,图片的链接是一个转账的链接,因为img的url没有跨域。点击了就会触发转账的操作,此时如果浏览器登录了,就会用到登录的状态 2. SQL 注入:使用包含 SQL 的脚本,插入到 HTML 中
- 对input等输入的内容进行过滤转换,将脚本转为字符串
- 前端禁止使用 insert_html 的方法
- Cookies 窃取:~~
浏览器为了防止不同源请求资源,所以规定了同源策略
但是为了方便用户,允许跨域请求js/css/img等资源
csrf (cross site request forgery): 跨站请求伪造
场景
- 伪造成一个吸引人的弹窗,诱导点击,点击后会窃取页面的
- 进行转账
- 发送恶意邮件
防范: 验证码
xss (cross site scripting): 跨站脚本攻击
场景
- 页面输入框中插入脚本,窃取 document.cookie 或 执行 SQL 语句
防范
- 用 npm 库对输入的内容进行过滤转换,将脚本转为字符串
- 禁止使用 innerHTML 的方法
- cookie 设置 httpOnly 为 true
- 设置 CSP(Content Security Policy)策略
第五章:Day 5
问题 1:如何使用 rem 或 viewport 进行移动端适配
问题 2:输入 URL 回车后发生了什么?
问题 3:html dom 的 event 事件
问题 4:清除浮动的几个方式
问题 5:AJAX 原理?
问题 6:JS 中 this 的情况
问题 7:CSS 预处理器 Sass、Less、Stylus 的区别
问题 8:前端性能优化(结合项目实践)
根据浏览器的原理实际使用的场景下,来分析性能优化的措施
- 由于单页面应用,第一次需要加装资源比较多
- 可以优化代码体积:使用打包工具 webpack、使用 gzip 压缩
- 可以优化代码传输:CDN 文本分发网络、使用 HTTP2 协议和缓存、优化代码请求个数和数据的优化
- 减少页面渲染代价高的行为
- 减少 DOM 操作
- 减少重排
数据大的时候,分页、懒加载
动画多的页面,使用新技术 react18(使用链表代替栈结构)
项目经验:
问题 9:call, apply, bind 三者的区别
- 相同之处:函数的方法,函数修改函数的 this 的指向,this 是指当前上下文,跟作用域有关。
- 区别:
- call 会立刻执行,返回执行结果
- apply 和 bind 是绑定 this 后返回一个函数
- ....apply(this, arguments) 参数是数组
- ....bind(this, arg1, arg2, arg3, ...) 参数是多个
问题 10:元素水平垂直居中
第六章:Day 6
问题 1:如何理解 CDN?实现原理?
问题 2:常见的类型转换
问题 3:伪元素、伪类区别
问题 4:跨域
问题 5:Event Loop 的执行顺序
问题 6:渐进增强与优雅降级的理解及区别
问题 7:浏览器样式兼容
问题 8:列举 ES6 的新特性
问题 9:常见的兼容性问题
问题 10:GC 垃圾回收机制
第七章:Day 7
问题 1:对比各种继承
问题 2:什么是原型 ? 什么是原型链 ?
问题 3:什么是作用域 ? 什么是作用域链 ?
问题 4:怎么解决父元素高度塌陷
问题 5:webpack 中 loader 和 plugin 的区别
问题 6:让一个元素水平垂直居中的方法
问题 7:如何自定义一个 webpack 插件 ?
问题 8:对比 import、import() 和 requrie 的区别
common.js es6
前端模块化的发展历史
- COMMON.JS ,通过 require 引入模块,是动态的。应用到 nodejs 中
- 因为是动态引入,所以很多问题在运行时才会暴露出来
- import 是 ESM 模块化,可以运用到 ES6 语法中,现在的主流浏览器也都原生支持了
- import() 是动态加载,可以实现按需加载,可以实现懒加载
Node.js 的模块加载的方法
ESM 和 CJS 的区别
- CJS 导出的是值,ESM 导出的是引用
- CJS 运行时加载,ESM 编译时输出接口
- CJS 的require()是同步加载模块,ESM 的import是异步加载模块
使用
- nodejs 13.2.0 之后,已经原生支持 ESM 模块化了
- 编写 ESM 模块,可以命名 .mjs
- 编写 COMMON.JS 模块,可以命名 .cjs
问题 9:async/await 的错误捕获方式
问题 10:box-sizing 所有的属性
参考
自问自答
react class 中,构造函数中为什么需要绑定 this?
执行上下文、this 的关系?
闭包是什么?作用域和作用域链?
js 寻找自由变量和寻找 this 的过程
- 自由变量是在代码定义的位置中就决定了
- this 的是执行的时候才决定
- 如果一个函数当做普通函数调用,它会指向全局对象 window, 所以有个严格模式可以规避改问题,使它 undefined
- 通过 call apply bind 可以显式指定 this 的指向
- 对象调用方法,this 指向该对象