宝典补充
把相关知识和复习方法放在一起,随时回看。
这份文档对照 files/面试宝典/ 中新增的面试资料,与现有六份题库逐题去重后,补充 86 道此前缺少或只被顺带提到的题目。每题按“回答要点 → 原理拆解 → 示例与推演 → 易错点 → 参考回答”组织;本文的“宝典 1~86”对应网站稳定题号 baodian-1~baodian-86。
资料只用于发现考点,答案独立整理,并按官方文档与实际运行行为校对。原资料中过时或有误的说法集中列在资料整理与纠错说明,相关题目内也会说明适用版本。
阅读入口:JavaScript 第一题、JavaScript 语言深化、浏览器与安全、React 进阶、工程化与 Node、跨端与业务场景、手写与算法。也可以从左侧知识分类进入。
按知识点 88 项内容
JavaScript21
QCommonJS、AMD、CMD、UMD 与 ES Module 是怎样演进的?今天还要关心哪些差异?Q迭代器协议和 Generator 是什么?怎样让普通对象支持 for...of?QV8 怎样执行和回收 JavaScript?JIT、隐藏类、新生代与老生代分别是什么?Qtry...catch 能捕获哪些异步错误?forEach 里 await 为什么不按顺序等待?Q怎样排查“到底是谁改了这个对象”?▤JavaScript 语言深化Qnew 做了什么?instanceof 为什么有时会误判?Q属性描述符、访问器,以及 freeze、seal、preventExtensions 有什么区别?Q原型污染是怎么发生的?怎样防护?Qawait、queueMicrotask、Promise.then 和 setTimeout 的执行顺序怎么推?QPromise 的 then、catch、finally 怎样传递值和错误?Qasync 函数一定返回 Promise 吗?await 后面不是 Promise 会怎样?Qarguments、默认参数、剩余参数和箭头函数有什么差异?Q解构和展开做的是浅拷贝吗?structuredClone 能替代手写深拷贝吗?Q哪些数组方法会改原数组?类数组怎样转成真正的数组?QJavaScript 字符串为什么按码元计数?正则的 lastIndex 为什么会串结果?QSymbol 解决什么问题?常见内置 Symbol 有什么用?Q怎样做可靠的深比较?JSON.stringify 为什么不行?Q严格模式改变了哪些行为?QES Module 循环依赖时,为什么会读到未初始化的值?Q对象的键会怎样转换?属性顺序和 delete 有什么规则?
HTML / CSS6
Q水平垂直居中有哪些写法?圣杯、双飞翼和 sticky footer 现在怎么实现?Q浮动为什么会造成高度塌陷?清除浮动有哪些方式,和 BFC 有什么关系?Q怎样用 CSS 画三角形?如何显示小于 12px 的文字和真正的 1px 细线?Qlink 与 @import、src 与 href、label、data-* 属性分别有什么区别和用途?QSass/Less、BEM、CSS Modules、Scoped 与 CSS-in-JS 分别解决什么?怎样治理样式冲突?Q渐进增强和优雅降级是什么?browserslist、Autoprefixer 与 polyfill 如何配合处理兼容?
浏览器与网络11
Q浏览器为什么采用多进程架构?一个标签页卡死为什么不一定拖垮整个浏览器?Q前端路由的 hash 与 history 模式怎样实现?刷新 404 如何配置?Link 和 a 有什么区别?Q手写一个 XMLHttpRequest 请求;XHR、fetch 与 axios 在进度、取消、错误判断上有什么区别?Qaxios 的拦截器、适配器和取消请求是怎样工作的?Q对称加密、非对称加密、哈希和数字签名分别解决什么问题?QCookie、Session、Token、JWT 怎样区分?JWT 泄露或需要立即失效怎么办?QOAuth 2.0 授权码流程是什么?扫码登录如何设计?QOSI 七层与 TCP/IP 四层模型分别是什么?前端常见协议在哪一层?Q浏览器为什么限制同源并发连接?域名分片在 HTTP/2 下还有用吗?QPWA 由哪些部分组成?怎样把传统网站改造成可安装、可离线的应用?QGraphQL 与 REST 有什么区别?什么时候值得引入?
Vue37
QVue 有哪些常用修饰符?Vue3 中 .native 和 .sync 去哪了?Q怎样写 Vue 自定义指令?用 v-permission 做按钮权限有什么局限?QVue 插件是什么?和组件有什么区别?全局方法应该挂 globalProperties 还是 provide?Q父组件怎样监听子组件的生命周期?QVue 应用中错误怎样分层捕获?errorHandler 和 errorCaptured 能捕获什么?Qcomputed 的缓存是怎么实现的?和 methods、watch 有什么区别?QReact 为什么需要 Fiber 和时间切片,Vue 却没有引入同样的机制?
React7
QJSX 本质是什么?为什么 React 17 以后不用再手动 import React?QReact 类组件的生命周期有哪些?PureComponent 与 Hooks 怎样对应?QRedux 的数据流和中间件原理是什么?redux-thunk 和 redux-saga 有什么区别?QRedux、MobX、Zustand、Vuex、Pinia 应该怎样选?QHOC、Render Props 和自定义 Hooks 有什么区别?逻辑复用该怎么选?QReact Scheduler 怎样实现时间切片和优先级调度?QReact 怎样实现类似 Vue keep-alive 的组件缓存?
TypeScript3
QTypeScript 装饰器怎样使用?标准装饰器和 experimentalDecorators 有什么区别?QTypeScript 中的协变、逆变、双变和不变是什么?strictFunctionTypes 改变了什么?QTypeScript 的 public、private、protected、#private、readonly 和抽象类有什么区别?
工程化11
QWebpack 的构建流程是什么?怎样写一个 Plugin?Qgit 的 merge、rebase、squash、revert、cherry-pick 分别在什么场景使用?QESLint 是怎样工作的?husky、lint-staged、commitlint 如何组成提交前检查?Q怎样从零写一个前端脚手架 CLI?Q前端测试怎样分层?Jest、Vitest、Testing Library、Playwright 各负责什么?Q前端项目怎样用 Docker 和 Nginx 部署?缓存头应该怎么配?Q新版本发布后,怎样提示正在使用旧页面的用户刷新?Q微前端解决什么问题?qiankun 的 JS 沙箱和样式隔离怎样实现?为什么不直接用 iframe?Q怎样搭建和发布一个公司内部组件库?QNode 如何利用多核?cluster、worker_threads 与 PM2 集群模式有什么区别?QNode 服务怎样安全地接收文件上传?
项目与场景12
Quni-app 是怎样实现一套代码多端运行的?条件编译、生命周期和分包要注意什么?QJSBridge 的原理是什么?H5 与原生 App 怎样双向通信?Q微信小程序的登录和支付流程是什么?Q低代码平台或表单生成器应该怎样设计?Q前端埋点有哪几种方式?曝光、停留时长和上报可靠性怎样处理?Q前端国际化需要考虑哪些问题?Q数据大屏怎样做多分辨率适配?图表组件如何封装和避免内存泄漏?Q超大文件下载怎样设计?Q怎样实现复制到剪贴板、禁止复制和粘贴时清洗内容?Q移动端的点击延迟、点击穿透和滚动性能问题怎样处理?Q页面水印怎样实现?怎样防止被轻易删除?Q前端有哪些反爬和防调试手段?它们的边界在哪里?
手写题9
Q手写 Generator 自动执行器,说明它和 async/await 的关系。Q实现可取消的 sleep,并按顺序每隔一段时间打印 1、2、3。Q手写链表的反转、合并两个有序链表和查找中间节点。Q手写快速排序,并说明 JavaScript 的 sort 是否稳定。Q实现括号匹配校验和滑动窗口最大值。Q用动态规划解决爬楼梯、最大子数组和与最长递增子序列。Q实现千分位格式化、模板字符串渲染和 Cookie 解析。Q怎样避免深递归导致栈溢出?实现蹦床函数、大数阶乘和迭代版数组扁平化。Q实现一个与服务器时间校准、不会越走越慢的倒计时。