大厂前端面试查漏补缺清单:基础 CSS、网络与工程化
下面给你一份**「大厂前端面试查漏补缺清单」**,覆盖:基础盲区、高频陷阱、工程化细节、框架易混点、安全、网络、手写、项目表达、面试话术,全部是“你以为会了但一开口就漏”的点,帮你把所有题集串成一张完整的安全网。
我会按「最容易翻车 → 最容易加分」排序,你可以直接对照自检。
一、JS 基础盲区(最容易翻车)
1. 类型与隐式转换(必补)
==与===底层区别:==会先做ToPrimitive/ToNumber,===直接比较类型+值。常见坑:
[] == ![]→ true([]转0,![]转false转0)[] == 0→ truenull == undefined→ true,null === undefined→ false
typeof与instanceof区别:typeof判基本类型,对null/数组/对象都返回object,不准。instanceof基于原型链,只能判对象。
正确判类型:
Object.prototype.toString.call(val) === '[object Array]'。
2. 闭包与作用域链(必补)
闭包本质:函数 + 其词法环境的引用,即使外层执行完,内部仍能访问外层变量。
闭包用途:模块化、私有变量、柯里化、保存状态。
闭包坑:内存泄漏(定时器/事件/全局引用)、循环中异步取值(用 let/立即执行/传参)。
3. 原型与继承(必补)
__proto__vsprototype:__proto__是实例指向原型的链。prototype是函数的“原型对象”,只有函数有。
new做了什么:创建空对象
空对象
__proto__指向构造函数prototype构造函数 this 指向该对象
执行函数
若返回对象则返回对象,否则返回 this
继承方式:
组合继承(最常用):原型链继承 + 借用构造函数
寄生组合继承(最优):避免重复调用父构造函数
ES6
extends本质就是寄生组合继承的语法糖
4. 异步体系(Promise/async/微任务)(必补)
Promise 三种状态:pending → fulfilled/rejected,状态一旦改变不可再变。
then/catch/finally都返回新 Promise,支持链式。宏任务/微任务执行顺序(必考):
执行同步代码
清空当前微任务队列
执行一个宏任务
再清空微任务
循环……
常见坑:
Promise.resolve().then()是微任务,比 setTimeout 早。await后面如果不是 Promise,会被包装成Promise.resolve。async函数默认返回 Promise。
5. 函数式/柯里化/防抖节流(必补)
柯里化:把多参函数转为单参链式调用,用于参数复用、延迟执行。
防抖:最后一次触发后延迟执行(搜索、输入)。
节流:固定时间内只执行一次(滚动、resize)。
手写必须会:防抖(立即执行版)、节流(时间戳/定时器版)。
二、CSS 盲区(容易被问细节)
6. BFC 是什么?触发条件?作用?
答:
BFC:块级格式化上下文,独立渲染区域,内部布局不影响外部。
触发:
float不为 noneposition为 absolute/fixeddisplay为 inline-block/flex/grid/table-celloverflow不为 visible
作用:
清除浮动
阻止 margin 重叠
阻止父元素高度塌陷
7. 层叠上下文(z-index 失效必问)
z-index 只对定位元素(relative/absolute/fixed/sticky)生效。
层叠上下文形成后,子元素 z-index 只在父上下文内比较。
z-index 失效常见原因:
父元素形成了层叠上下文
元素未定位
层级被 transform/opacity 等影响
8. flex 布局细节(必补)
flex: 1等价于flex: 1 1 0%(放大1、缩小1、基础尺寸0)。flex-basis优先级高于width。justify-content/align-items/align-self/flex-wrap/gap必须熟练。常见坑:
- 子元素
width: 100%在 flex 下会被压缩,需flex-shrink: 0。
- 子元素
9. CSS 性能与渲染(必补)
昂贵属性:
box-shadow/filter/gradients/opacity频繁变化会重绘。动画优先用
transform/opacity(合成线程,不重排)。will-change提示浏览器,但不要滥用,会占用内存。
三、网络与安全(大厂必问,很多人只懂一半)
10. HTTP 缓存完整流程(强缓存/协商缓存)(必补)
强缓存:
Cache-Control: max-age=xxx(优先)、Expires。协商缓存:
响应:
Last-Modified/ETag请求:
If-Modified-Since/If-None-Match304 用缓存,200 用新内容
优先级:
Cache-Control>Expires;ETag>Last-Modified。
11. HTTPS 流程(必补)
客户端发起 HTTPS 请求(443)
服务端返回证书(公钥+签名)
客户端验证证书合法性
客户端生成随机对称密钥,用服务端公钥加密发送
服务端用私钥解密得到对称密钥
后续通信用对称密钥加密(AES)
- 作用:防窃听、防篡改、防冒充。
12. 跨域与 CORS(必补)
跨域:协议/域名/端口任一不同。
CORS 简单请求:
方法:GET/HEAD/POST
头:Accept/Accept-Language/Content-Language/Content-Type(application/x-www-form-urlencoded/multipart/form-data/text/plain)
预检请求 OPTIONS:
非简单请求会先发 OPTIONS,服务端返回允许的方法/头/源。
优化:
Access-Control-Max-Age缓存预检结果。
13. 常见安全攻击与防御(必补)
XSS:注入脚本 → 防御:转义、CSP、HttpOnly、输入校验。
CSRF:跨站请求伪造 → 防御:Token、SameSite、Referer 校验。
点击劫持:iframe 覆盖 → 防御:X-Frame-Options、CSP frame-ancestors。
注入攻击:SQL/命令 → 防御:参数化查询、白名单、权限最小化。
四、工程化与构建(容易被问“细节”)
14. Webpack 核心概念(必补)
entry/output/loader/plugin/mode/chunk/bundle。
loader:转换非 JS 文件(css-loader、babel-loader)。
plugin:扩展功能(HtmlWebpackPlugin、MiniCssExtractPlugin)。
优化:splitChunks、tree shaking、缓存、多进程、DLL。
15. Vite 为什么快(必补)
开发:
基于 ES Modules,浏览器按需请求,不打包。
esbuild 预构建依赖(比 webpack 快 10-100 倍)。
HMR 只更新修改模块,秒级热更。
生产:Rollup 打包,体积更小。
16. Tree Shaking 前提(必补)
ES Module(import/export)静态分析。
生产模式,开启优化。
无副作用(
sideEffects配置)。
17. 产物分析(必补)
工具:webpack-bundle-analyzer、source-map-explorer。
常见问题:
多版本依赖(lodash 多版本)
全量引入 UI 库
devDependencies 打入生产包
未 Tree Shaking
五、React 易混点(查漏补缺)
18. React 合成事件与原生事件区别(必补)
合成事件:委托到 document,减少监听器,跨平台一致。
原生事件:addEventListener,直接绑定到元素。
坑:合成事件是复用对象,异步中需
event.persist()。
19. React.memo / useCallback / useMemet 正确用法(必补)
memo:缓存组件,浅对比 props。
useCallback:缓存函数,避免子组件重渲染。
useMemo:缓存计算结果,避免重复计算。
误区:不要无脑包,只有 props 频繁变化、组件重渲染昂贵时才用。
20. Context 性能陷阱(必补)
value 是对象/函数 → 每次渲染新引用 → 所有消费组件重渲染。
优化:拆分 Context、useMemo 缓存 value、只订阅需要字段。
21. React 18 并发特性(必补)
自动批处理:所有场景 setState 合并。
useTransition:标记低优先级更新,不阻塞交互。
useDeferredValue:延迟非紧急值。
Suspense:数据获取 + 加载状态。
六、Vue 易混点(查漏补缺)
22. Vue2 vs Vue3 响应式区别(必补)
Vue2:Object.defineProperty 劫持属性,递归,无法监听新增/删除/数组下标。
Vue3:Proxy 代理对象,懒代理,支持新增/删除/Map/Set。
23. ref / reactive / toRefs / toRef(必补)
ref:包装基本类型/对象,需 .value。
reactive:代理对象/数组,直接访问。
toRefs:把 reactive 转为 ref 集合,解构不丢失响应式。
toRef:为 reactive 某个属性创建 ref。
24. Vue3 编译优化(必补)
PatchFlag:只 diff 动态节点。
静态提升:静态节点提升到渲染函数外。
事件缓存:内联事件缓存。
25. Vue 组件通信(必补)
- props/ $emit、v-model、provide/inject、eventBus、Vuex/Pinia、$ attrs。
七、Electron 易混点(查漏补缺)
26. 主进程 vs 渲染进程(必补)
主进程:Node.js,窗口管理、原生 API、IPC。
渲染进程:Chromium,UI 渲染,默认沙箱。
preload:安全桥梁,contextBridge 暴露 API。
27. IPC 通信(必补)
ipcRenderer.send / ipcMain.on(单向)
ipcRenderer.invoke / ipcMain.handle(双向 Promise)
避免 sendSync(阻塞渲染)。
28. 安全配置(必补)
nodeIntegration: false
contextIsolation: true
校验参数,防路径遍历/命令注入。
八、性能优化“体系化表达”(面试最加分)
29. 性能优化完整方法论(你必须会说)
度量:确定指标(LCP/CLS/FID/包体积)
分析:Lighthouse/Performance/Network/产物分析
优化:按优先级(网络 > 渲染 > JS > 内存)
验证:复测指标
监控:RUM + 性能预算 + 回归测试
30. 首屏优化万能方案(你必须会说)
图片:WebP、懒加载、响应式、骨架屏
资源:关键 CSS 内联、非关键异步、代码分割、Tree Shaking
网络:HTTP 缓存、CDN、预连接、接口合并
JS:防抖节流、长任务拆分、Web Worker、懒执行
框架:memo/useCallback/useMemo、虚拟列表、keep-alive
九、手写题“保底清单”(必须全会)
下面 10 个是大厂必考手写,你必须能 1 分钟写出来:
防抖(含立即执行)
节流(时间戳版)
Promise 手写(简易版)
Promise.all / Promise.race
深拷贝(简易版/循环引用版)
柯里化
数组去重
数组扁平化
图片懒加载(Intersection Observer)
虚拟列表(简易版)
十、项目表达“万能模板”(避免无话可说)
面试官问:“介绍一个你最有亮点的项目/做过的优化”
你按这个结构说,稳得一批:
1. 背景(10 秒)
项目:XX 平台(后台/电商/工具/桌面端)
技术栈:React/Vue + TS + Webpack/Vite + Electron(如有)
问题:首屏慢、卡顿、体积大、用户体验差
2. 目标(5 秒)
LCP < 2.5s
包体积减少 30%+
卡顿率下降 50%+
3. 分析(20 秒)
Lighthouse:LCP 4.2s,CLS 0.25,长任务多
Network:图片大、资源多、接口慢
Performance:重排重绘频繁、JS 执行长
产物分析:依赖冗余、未 Tree Shaking
4. 方案(40 秒)
图片:WebP、懒加载、响应式、骨架屏
资源:关键 CSS 内联、代码分割、懒加载、Tree Shaking
网络:HTTP 缓存、CDN、接口合并、预连接
JS:防抖节流、长任务拆分、Web Worker
框架:memo/useCallback/useMemo、虚拟列表、keep-alive
构建:压缩、Gzip、产物分析、依赖裁剪
5. 结果(10 秒)
LCP 4.2s → 1.6s
包体积减少 40%
卡顿率下降 70%
用户留存/体验提升
十一、最后 10 条“面试保命话术”
不会的题:“这个我不太熟,但我可以按思路推导一下……”(不要直接说不会)
问原理:“核心是……,解决了……问题,具体流程是……”
问优化:“先度量,再分析,再优化,再验证,再监控”
问项目:“背景→问题→分析→方案→结果→数据”
问框架:“理念→原理→用法→优缺点→适用场景”
问安全:“风险→原理→防御措施→落地”
问网络:“流程→状态码→缓存→跨域→优化”
问手写:“先讲思路,再写代码,再讲边界/优化”
问未来:“学习计划+技术趋势+结合业务”
反问环节:“团队技术栈?项目阶段?性能/质量要求?培养机制?”
最终结论
你现在手里的题集 + 上面这份查漏补缺 = 大厂前端面试全覆盖。
只要你把这些内容过一遍 + 手写题练熟 + 项目表达练顺,面试基本稳了。
如果你愿意,我可以最后给你做一份:
「前端面试 20 题终极押题(含标准答案+话术)」
或者
「3 天突击计划(每天 1 小时,直接背)」
你想要哪个?
(注:文档部分内容可能由 AI 生成)