其实很早就想写一篇前端面试的经验帖了,最近刚好有好几个学弟学妹在问“前端面经到底怎么用”,也看到不少人在 2026 届秋招和社招的节点上刷面经刷得很痛苦。今天我就把这个话题彻底聊透,把我的实际经验、踩过的坑、复盘出来的东西全部整理成文。不管你是准备校招、跳槽,还是单纯想检验一下自己的前端水平,这篇文章应该都能帮到你。
先说说我对“WEB前端 面经”这件事的基本判断:面经不是给你背答案的,它是你建立知识地图、查漏补缺、模拟实战的重要参考。如果你只是收藏一堆面经,从第一篇背到最后一篇,那面试官稍微换个角度追问,你就很容易露馅。我见过太多人拼命刷面经,结果面试的时候连原型链和事件循环都讲不清楚,为什么?因为面经里只有问题,没有背后的体系和原理。所以这篇文章,我会站在一个比较系统化的角度,把前端面试的核心考点、准备方法、实战流程全部拆开来说,也会穿插一些真实的面试记录和复盘经验。
文章适合谁?正在准备前端校招的应届生、打算金三银四跳槽的初级和中级前端开发者,以及想系统梳理前端知识体系的朋友。我已经默认你有一定前端基础,至少写过 Vue 或 React 项目,而不是纯零基础入门。如果你零基础,建议先把 JS 和 HTML/CSS 基础过一遍再来看这篇文章,效果会好很多。
1. 面经不是拿来背的,先理清面试官在考什么
1.1 一份面经的正确阅读方法
我刷面经的习惯是这样的:拿到一份面经,不是直接看答案,而是先把所有问题过一遍,按领域分类,然后问自己三个问题:这个问题我能不能用两分钟讲清楚?这个问题背后的知识点,我知道它怎么来的吗?如果我被追问“原理是什么”,我能不能接住?这三个问题只要有一个答不上来,这道题就应该标记为“待复习”,而不是简单看看答案就算过。
举个例子,面经里经常出现“说一下事件循环”这道题。很多人背了一套“宏任务、微任务”的流程就去了,结果面试官追问一句“为什么 Promise 的 then 要设计成微任务”,很多人就卡住了。其实这个追问在考察一个更本质的点:事件循环是浏览器为了协调 JS 单线程、渲染进程和任务优先级而设计出来的一套调度机制。你如果把这个背景讲清楚,再落到代码执行顺序上,那这一题就稳了。
所以我强烈建议大家,在看面经的时候,把一个问题的答案当起点,而不是终点。每个考点往下追问两三层,问到“为什么这么设计”这个层面,你的知识体系才算真正建立起来了。
1.2 前端面试的知识体系地图
前端面试的考察范围,说穿了就六大块:HTML/CSS 基础、JavaScript 语言核心、浏览器工作原理与性能、网络协议、框架(React/Vue 二选一)与工程化、算法与手写代码,外加项目和软技能。不同公司不同岗位,权重会有差异。大厂校招通常非常重视算法和基础,中厂和业务向岗位更看重框架深度和项目经验,前端基建类的岗位会盯着工程化和浏览器原理问。
我可以给一个相对通用的优先级参考,大家按自己的目标岗位去调整:
| 考察方向 | 校招权重 | 社招 (3-5年) 权重 | 优先级建议 |
|---|---|---|---|
| JS 语言核心 | 极高 | 极高 | 第一优先级,重理解 |
| 浏览器原理与渲染 | 高 | 高 | 第二优先级,重关联 |
| 网络协议 | 中高 | 中 | 结合前端实践去记 |
| 框架 (React/Vue) | 高 | 极高 | 项目结合原理一起讲 |
| 工程化构建 | 中 | 高 | 按项目实际使用去深挖 |
| 算法与手写 | 极高 | 中高 | 校招重点,社招可降权 |
| 项目与软技能 | 高 | 极高 | 决定最终定级关键 |
这张表不是唯一的答案,但它帮我避了很多坑:早期我把大量时间花在过度钻研某个冷门 CSS 特性上,后面才发现面试官根本不问这种,浪费时间不说,还占用了系统复习核心知识的精力。建议你也先给自己画一张这样的表,所有复习时间往高优先级项倾斜,才能做到真正高效。
2. 核心考点拆解:JS 与浏览器原理是全场主角
2.1 事件循环:从执行顺序到设计哲学
事件循环这个话题,几乎是所有前端面试的必考题。但我发现大多数人的准备方式都停留在背输出顺序的层面,比如给一段代码,说出打印结果是 1、3、2 还是别的。这个当然要会,但只会背输出是不够的,面试官一旦换个角度问你就容易慌。
我建议你从三个层面准备。
第一层:会判断宏任务和微任务的执行顺序,知道 script 整体是宏任务,Promise.then、MutationObserver 是微任务,setTimeout、setInterval、IO 事件是宏任务。
第二层:能解释清楚为什么微任务先于宏任务执行。这里的关键是,微任务队列是在当前宏任务执行栈清空之后、浏览器渲染之前被清空的,而宏任务要等下一次事件循环才执行。正因为这个机制,Promise 的回调才能尽快执行,避免不必要的渲染阻塞。
第三层:能结合浏览器多线程模型来讲。JS 是单线程语言,但浏览器是多线程的,网络请求、定时器、事件监听都由浏览器其他线程协助处理。事件循环本质上是 JS 主线程与其他线程之间的协作桥梁。你讲到这一层,面试官通常就会点头了。
再给大家一个我实际问过的追问方向:async/await 在事件循环里是怎么表现的?很多人以为 await 后面跟一个 Promise 就直接按微任务处理,其实不是的,await 会把它后面的代码包装成微任务,但有细节差异(比如浏览器对 await 的优化会导致执行时机不同)。这个点稍微有点深,但如果你能主动说清楚,绝对是加分项。
2.2 原型链与继承:从原理到代码题
原型链也是一道高频题,而且比事件循环更容易暴露水平。因为这个问题从“口述概念”到“手写代码”都能考,考察维度很立体。
你要能讲清楚这几个概念:构造函数、原型对象、实例对象之间的关系,__proto__和prototype的区别,原型链的查找规则,以及Object.create(null)和普通对象字面量的区别。还有 ES6 class 的语法糖本质,它是基于原型的,但和传统的构造函数又有细节差异,比如 class 的方法是不可枚举的。
代码题方向,最常见的无非是手写几种继承:原型链继承、构造函数继承、组合继承、寄生组合继承。我强烈推荐大家把寄生组合继承完整默写一遍,再和 ES6 class 编译出来的写法做对比,你会对继承的理解有一个质的提升。我当年就是在这一题上翻了车,只写出了组合继承,被面试官追问了一句“组合继承有什么缺点”,我当时就哑了。缺点其实很清楚:父类构造函数被调用了两次,子类实例上多了一份冗余属性。你要是答出这一点,再补一句“所以用寄生组合继承,或者直接用 ES6 class”,这道题基本就是满分。
2.3 浏览器渲染与性能优化
这一块在面经里出现的频率也很高,尤其是喜欢问“从输入 URL 到页面展示发生了什么”“回流和重绘的区别”“如何减少回流”。这些问题听起来是八股,但面试官往往通过追问来考察你是否真正理解渲染管线。
建议把完整的流水线记清楚:解析 HTML 构建 DOM 树,解析 CSS 构建 CSSOM,合并成渲染树,布局计算(Layout),绘制(Paint),合成(Composite)。其中最关键的两步是布局和绘制。布局要是频繁触发,代价特别高,因为布局过程会牵连很多元素重新计算位置和尺寸。
性能优化的实操题也很常见,比如你怎么减少首屏白屏时间。面经里能看到的答案通常是:CDN 加速、开启 Gzip、JS 文件拆分按需加载、骨架屏、SSR/预渲染。这些都没错,但如果你只能报菜名,面试官其实很难分辨你是真的做过还是背的。我自己的经验是,选一个方案往深了讲。比如拆包,你可以讲清楚 webpack 的 optimization.splitChunks 怎么配置,公共依赖怎么抽,异步路由怎么分包,每个 chunk 的大小怎么分析。再比如骨架屏,你可以讲讲是手写的还是配的插件,关键节点怎么流式加载。这种细节,比十个概念都管用。
3. 框架与工程化:React 是避不开的主战场
3.1 React 基础看什么:组件通信、Hooks 与数据流
前端框架是必考项,市面上主流还是 React 和 Vue 二分天下。我自己的主栈是 React,所以重点讲讲 React 方向的面试准备,Vue 方向逻辑也是类似的,只是细节不同。
React 面经里最常出现的问题,几乎绕不开 this 绑定的问题(class 组件时代)、函数式组件和 class 组件的区别、Hooks 的使用与限制、受控组件与非受控组件、组件通信方式。其中组件通信方式是一道经典的开放题,你要能从 props 递数据扩展到 Context、Redux/Zustand 等全局状态管理,再扩展到 ref 实例方法调用,才能显示出经验。
Hooks 是这个时代的重头戏。面试官特别爱问 useEffect 的执行时机和依赖数组的问题,还有 useCallback 和 useMemo 的区别,以及常见闭包陷阱。闭包陷阱几乎是我见过面试者最容易踩的坑,也是真实项目里容易埋雷的地方。举例说明:一个计数器组件里,定时器依赖 count 变量,但你在 useEffect 依赖数组里传了 [],结果定时器回调永远看到的都是初始 count。解决方案也很简单,把 count 放到依赖数组,或者用函数式更新 setCount(c => c + 1),更复杂一点可以用 ref 保存最新值。面经会告诉你要注意依赖,但面试官更希望听到你能解释清楚为什么依赖不对会导致闭包捕获旧值,以及解决这个问题的几种思路分别适合什么场景。
Fiber 架构也是高频追问点。很多初级面试者只会说“React 16 之后引入了 Fiber”,再往深就说不出来了。至少要掌握:Fiber 为什么出现(要解决同步渲染长时间占用主线程的问题)、它是什么(一个工作单元的数据结构)、怎么实现打断恢复(利用链表结构维护树的关系,配合 requestIdleCallback 配合 scheduler)。你可以不用把源码全看明白,但是思路一定要能讲出来。
3.2 工程化与构建:Webpack/Vite 的常考方向
工程化方向的题,在社招里出现频率明显更高。最常见的是 webpack 的构建流程、loader 和 plugin 的区别、代码分割、Tree Shaking 原理、热更新原理,以及 Vite 和 webpack 的对比。
loader 和 plugin 的区别是基础中的基础。loader 负责对模块的源码进行转换,是一个函数,处理单个文件;plugin 则是在打包过程的生命周期中做更广泛的处理,比如打包前清理目录、生成 HTML 文件、做体积分析。你最好能举几个实际例子,比如 style-loader、css-loader、babel-loader 分别解决什么问题,html-webpack-plugin 和 mini-css-extract-plugin 分别在什么阶段做图什么。
Tree Shaking 和按需加载也是被问高频的问题。Tree Shaking 依赖 ES Module 的静态结构,webpack 才能分析出哪些导出没被使用。如果项目还在用 CommonJS 的 require,Tree Shaking 基本会有坑。按需加载常见 UI 组件库的逻辑其实也是走 ES Module 或单独的路径导入。追问大概率是:“你的项目里有没有遇到过 Tree Shaking 不生效的情况?”如果能举一个实战中的反例并说清原因,比如某个库的 sideEffects 配置导致样式被误删,或者没有配置 sideEffects 导致摇树失效,这一题就能压住场。
Vite 和 webpack 的对比,重点讲清楚 esbuild/rolldown 的开发预构建与原生 ESM 服务,生产环境打包则可能交给 rollup/Rolldown。核心差异是一个不用像 webpack 那样启动打包完再启动开发服务器,而是按需编译。如果你项目里实际用过 Vite,那开发体验、冷启动速度、依赖预构建这些细节都会是加分项。
4. 算法与手写题:题库怎么刷才算有效
4.1 高频题型速览与刷题策略
算法部分,不同人基础差异很大。从我刷到的面经统计来看,前端考算法的风格明显偏向工程向:复杂度要求通常不高,但更看重边界处理和代码规范。常见题型有这么几类:数组与字符串、链表、二叉树、栈与队列、排序与二分、动态规划(初级),以及少量堆和图的题目。
我个人的建议是:按题型分类刷,不要按题库顺序盲刷。按题型刷的好处是你能在短时间内建立同一类题的通用解法模型,比如看到“二叉树的最近公共祖先”,你能想到递归自底向上的判断;看到“连续子数组最大和”,你能直接写出 Kadane 算法。这种“题感”是面试时快速反应的关键。
还有一个经常被忽略的点:手写代码的规范性和边界处理。很多候选人在 LeetCode 上跑通就算了,但面试手写的时候,函数没做空值判断、没考虑边界输入、变量命名混乱,都会导致印象分下降。我建议准备一个自己的代码模板,包括输入校验、递归出口、变量命名规范,每道题都用这个模板去写,练到形成肌肉记忆。
4.2 手写题要怎么准备:从记忆到理解
前端手写题的范围比较固定,但也最容易变成“背题”。比如手写 Promise.all、手写防抖节流、手写深拷贝、手写发布订阅、手写 call/apply/bind。面经里都有,很多人也都背了,但面试官一追问“如果 Promise.all 里某个请求失败了怎么处理”“深拷贝怎么解决循环引用”,就有人答不上来。
我的建议是,每一道手写题都从需求出发理解,再动手实现。以深拷贝为例,面试官想看的是一个完整的问题分析过程:基础类型直接返回、函数和日期等特殊对象怎么处理、数组和对象怎么区分、循环引用怎么通过 WeakMap 避免、Symbol 和不可枚举属性要不要处理。你如果能在白板上一边写一边说出这些考虑,就已经超越了 90% 的候选人。
防抖节流也是重灾区。很多人背模板,但不知道在什么场景用防抖、什么场景用节流。我通常建议用一个实验项目去验证:搜索框输入用防抖,滚动加载用节流。在给面试官讲的时候把这些实际场景带出来,比单纯写出代码要打动人的多。
Promise.all 的实现思路也要吃透:返回一个新的 Promise,内部维护一个数组和一个计数器,遍历执行入参,如果某个 Promise 失败就直接 reject,全部成功后 resolve 结果数组。进阶点还有 Promise.race、Promise.allSettled、Promise.any 的共同点和差异。这个系列如果都弄明白了,你的 Promise 基础就相当扎实了。
5. 项目经历和 HR 面:技术之外的决胜点
5.1 项目怎么讲才能规避雷区
技术面里,项目经历占的比重特别大,尤其是社招。我见过太多候选人有很好的项目,讲的时候却毫无亮点。最常见的雷区是流水账——从项目背景开始,然后“我负责了用户管理模块,实现了登录、注册、列表页”,面试官听完完全感受不到你的思考。
讲项目其实是有方法论的。我建议用一个四段式结构来准备:项目背景与难点、我的核心职责、关键决策与方案对比、项目最终结果与复盘思考。尤其是“关键决策与方案对比”这一块,是最容易体现技术深度的环节。比如你做了一个性能优化项目,为什么要选虚拟列表而不是懒加载?当时的数据量是多少,虚拟列表的窗口高度怎么算的,滚动过程中有没有闪烁问题?这些问题任何一个展开都是加分项。
我也建议准备几个项目中的真实“事故复盘”。比如线上出现了一个 bug,你当时怎么排查、怎么定位、怎么修复、怎么避免再次发生。事故复盘是非常好的考察维度,因为它是能力的综合体现,远比用词华丽的技术方案更能打动面试官。
还有一个细节:项目的数据要提前准备。这个页面首屏从 3 秒降到 1.2 秒,你的优化具体做了什么?这个表格渲染 3000 条数据卡顿,你是通过什么工具测出来的性能瓶颈,优化后 FPS 从多少涨到多少?只要数据扎实,对话质量会瞬间提升。
5.2 HR 面与软技能:别输在最后一关
很多人对 HR 面不重视,觉得走个过场,其实 HR 面挂人的比例远比想象中高。HR 面主要考察三件事:稳定性、团队协作能力、求职动机。三件套问题“你为什么离开上一家公司”“你期望的薪资是多少”“你未来的职业规划是什么”,每个都值得提前准备。
我踩过一次坑是薪资谈得不够透明。当时面试官问期望薪资,我给出了一个区间,结果被压到了区间下限。后来复盘发现,区间本身就是给谈判空间,HR 一定会倾向下限,更好的做法是给一个大方向但又留有余地,比如“期望薪资在 X 左右,如果团队和业务比较匹配,也可以再聊”。这种说法既表达了你的期望,又给对方留了回旋空间。
关于“为什么离开上一家公司”,原则是:不抱怨前公司和前领导,哪怕真实情况真的很糟。可以从职业发展路径的角度去讲,比如“我在这家公司主要负责 XX 模块,但我希望接触更深度的技术挑战,所以我选择了这个岗位”。没有任何负面评价,HR 挑不出毛病。
HR 面还有一个很多人没意识到的点:你在技术面时给面试官的印象,会在 HR 面延续。如果技术面时你沟通消极、事事反驳,HR 面再怎么说自己团队协作好,可信度都要打折扣。所以把 HR 面当作整个面试流程的自然延伸,而不是独立的一场戏。
6. 我的实战记录与复盘:校招与社招的真实经历
6.1 一场典型面试的时间线拆解
以我最近一次社招面试某大厂为例,整个流程大约持续了三周。第一轮是电话技术初面,大概 45 分钟,考了一个 JS 输出题、一个浏览器缓存、一个手写节流;第二轮到现场(现在是视频)二面,大概一小时,深挖项目并追问到细节,再加了一道二叉树题;第三面是技术终面,属于交叉面,主要看团队协作和技术视野;最后是 HR 面。
每一轮面试的侧重点不一样,你要提前做好心理准备。一面通常比较基础,考察“知识会不会”;二面往往结合项目深挖,考察“能力真不真”;三面更多是综合评估,考察“和团队的匹配度”。所以千万别准备完一面就松懈,每轮对应不同的技能树。
我记忆最深的一次是二面,面试官没有按常规套路出牌,而是直接给了我一个场景题:“如果我们要把现有项目的首屏性能提升一倍,你会怎么落地?”他没有给我任何数据,需要我自己问,自己设计。那一轮我的表现其实一般,因为我习惯性地按答案模板去说,而忽略了他想看我如何拆解问题、如何取舍。复盘之后我学到一个经验:场景题不要急着给答案,先确认几件事——当前性能瓶颈在哪、目标是什么、有哪些资源可用,然后分阶段给出方案。哪怕方案不是最佳,这种结构化的思维过程非常加分。
6.2 面试中的常见翻车场景与排查方法
我还想花点篇幅,专门写写面试中比较容易翻车的场景,因为这些坑几乎每一位候选人都会遇到。
第一个是“话太多,反被带偏”。有一次我讲事件循环的时候,顺口提到了 Node.js 的 libuv,其实我对那一块了解并不深,结果面试官顺藤摸瓜问了个 libuv 线程池的问题,我当场卡住了。后来我养成了一个习惯:不熟悉的话题坚决不主动提,除非能保证往下接住三四个追问。这一点看起来很小,但真的能避免很多不必要的翻车。
第二个是“紧张导致逻辑混乱”。这个没办法完全消除,只能靠多练。我自己用的是录音模拟法:准备高频问题,打开手机录音,自己对着空气讲一遍,再放出来听,找出不流畅、逻辑断层的地方,反复修正。这个方法虽然有点傻,但效果极其明显,比默背十遍都管用。面试的时候,哪怕紧张,身体也会记得你练习时的表达节奏。
第三个是“项目讲太久,重点不突出”。我见过有人讲项目讲了 15 分钟还在讲业务背景,面试官早就不耐烦了。建议把项目故事压缩到 3-5 分钟,把最亮点的部分留出来让面试官追问。一定要做减法,而不是加法。
6.3 面试后的复盘方法
面试结束不是终点,复盘才是拉开差距的开始。我每次面完,会趁记忆还热的时候,把这次面试所有问题列成一个清单,每个问题标上三个状态:答得很好、答得一般、完全不会。答得一般的和完全不会的,就是下一次复习的重点。
复盘的时候还要复盘自己的情绪和表达。比如有没有因为面试官打断而失去节奏,有没有因为一道不会的题影响了后面的发挥。我前几次面试有一个典型问题:某道算法题卡住了五分钟,后面整个状态就开始崩,导致项目问答也发挥失常。后来我给自己定了一个规则:任何一道题卡住超过三分钟,就主动向面试官要提示。不要觉得丢人,面试官更在意你的抗压能力和沟通方式,而不是你是否每道题都能秒解。
面经千千万,你自己总结出来的东西才是最有价值的。每次面试都是一次免费的能力体检,查出来的问题越早,你修正的成本就越低。把面试当作一次学习机会,你会觉得整个过程没那么痛苦,反而有一种不断升级的快感。
写在最后:两条我最想强调的经验
第一个经验是:所有考点都要能落到代码。面试官问“你知道深拷贝吗”,你不仅要说得清原理,还要能现场写出来;问“你了解 React Hooks 闭包陷阱吗”,你要能写一个小 demo 讲清楚问题是怎么产生的、怎样修复。语言表达得再漂亮,落到代码上露馅,前面所有准备都白费。所以我强烈建议,所有你觉得自己掌握的知识点,找时间都把它写成代码、写成文档、做成 demo。
第二个经验是:构建一个自己的知识链接网,而不是孤立的知识点。比如你学了浏览器缓存,就要能联想到 HTTP 的 Cache-Control 头、到强缓存/协商缓存的区别、再到项目里静态资源的哈希指纹策略。可以串成一条知识链。面试官最喜欢问的场景就是“你讲到一个知识,能不能牵出旁边的另一个知识”。能主动牵出来的人,和只能被动回答问题的人,面试评价完全不在一个量级上。
最后再分享一个小技巧:准备一份“自己的面经”,把你遇到的每一次面试问题都记录进去,形成属于自己的题库。无论最终进不进某家公司,这份面经都是你技术成长的最好见证。祝大家都能拿到心仪的 offer。