
2021年小米秋招前端方向第一场笔试这个话题放到现在看依然有很强的参考价值。大厂前端笔试的考察逻辑这些年虽然一直在变但核心筛选标准没有变过基础扎不扎实、思路清不清晰、代码能不能落地。我身边有不少人问过我当时这场笔试的情况也有人拿着别家公司的题目来对比发现小米这场笔试题的区分度做得比较好不像某些公司要么纯八股文堆砌要么直接上 hard 级算法题把人劝退。这篇就把我当时对这场笔试的拆解、复习重点、现场答题策略和事后复盘整理出来给准备大厂前端笔试的同学一个可以照着准备的方向。1. 笔试整体设计思路大厂前端笔试到底在筛什么1.1 表面是做题实际是在模拟“能不能干活”很多同学准备笔试有个误区觉得笔试就是在考“背了多少面试题”。实际上大厂前端笔试的核心逻辑是模拟真实工作场景中的问题拆解和解决能力。2021年小米秋招前端方向第一场笔试的题目设置明显不是为了让候选人背出标准答案而是看你在有限时间内能不能快速定位问题、组织思路、写出一段能跑的代码。举个例子笔试题里经常出现“给一段有 bug 的代码让你修复”或者“给你一个场景让你实现某个交互逻辑”这类题考察的不只是语法熟不熟练而是你在实际业务中遇到类似问题时能不能快速理解现有代码的意图找到问题根因并且用最稳妥的方式改掉。这和工作中接到一个需求、打开一个别人写的模块、开始改 bug 的流程是完全一致的。所以准备笔试不能只刷题要改变思维方式把自己当成一个已经在公司里干活的前端工程师题目就是你的工单。这样你会更容易理解出题人为什么这么考也更容易踩中得分点。1.2 题型分布与分值逻辑从整体来看这场笔试的题型大致可以分为四块基础选择题/填空题、手写代码题、算法题、场景分析题。每个题型的考察目标和分值逻辑完全不同复习策略也应该区别对待。题型大致占比考察目标准备策略基础选择/填空30%-40%语言细节、浏览器原理、网络协议八股文为主但需要理解记忆手写代码题25%-30%JS 功底、常见工具函数实现、DOM 操作高频手写题必须能默写算法题20%-25%数据结构与算法基本功刷常见题型不必追求难题场景分析题10%-20%工程化思维、性能优化意识、方案设计重点准备容易拉开差距基础题分值虽高但区分度有限因为大部分人都能答对一半以上真正拉开差距的是手写代码题和场景分析题。手写题考的是“你会不会”和“你写得规不规范”场景题考的是“你遇到问题有没有思路”。我备考时把大量时间放在了这两块事实证明这是性价比最高的选择。1.3 出题风格背后的筛选意图小米这场笔试的出题风格比较务实没有太多偏题怪题但陷阱设置得很细。比如有些选择题会故意把“深拷贝和浅拷贝的区别”“let 和 var 在循环中的作用域差异”这类基础知识点变形包装让你一不小心就掉坑。这说明出题人默认你已经掌握了基本概念考察的是你能不能识别概念在实际代码中的表现。这种风格背后反映的是前端岗位的实际需求业务开发中大量时间是在处理边界条件、兼容性问题、状态管理问题这些都需要对语言和运行时有深刻理解。如果你只是背了“闭包就是函数内部访问外部变量”这样的定义却看不懂闭包在循环中导致的经典 bug那在笔试中就会很吃亏。一句话总结这场笔试不考“知识面”考“理解深度输出能力”。掌握了这一点后面的复习方向就清晰了。2. 核心考点拆解这些内容必须吃透2.1 JavaScript 语言功底是绝对重点前端笔试不管是哪家公司JavaScript 都是占比最大的考察方向。2021年小米这场笔试也不例外JS 相关题目分布在选择题、手写题和场景题中几乎是全面覆盖。备考时我给自己定了几个必须吃透的专题执行上下文与作用域链、闭包、原型与原型链、this 指向、事件循环、Promise 与异步编程。事件循环这个知识点我建议深入理解而不是背结论。很多同学只知道“宏任务和微任务”这个粗粒度分类但遇到“Promise 里套 setTimeout、async/await 混用”这种组合题就懵了。我在准备时用一段典型代码反复推演执行顺序直到能带着面试官走完整条任务队列的入队出队过程async function test() { console.log(1); await Promise.resolve(); console.log(2); } setTimeout(() console.log(3), 0); test(); Promise.resolve().then(() console.log(4)); console.log(5); // 输出顺序1、5、4、2、3很多人不理解为什么 2 在 4 后面原因是 async 函数中的 await 会将其后续代码放入微任务队列而 Promise.resolve().then 的回调先注册所以先执行。这个例子我建议自己手推一遍比背十遍理论都有用。原型链部分要注意构造函数、实例、原型对象三者之间的关系。我通常会画一张三角关系图把Person.prototype.constructor Person、person.__proto__ Person.prototype这些关系梳理清楚。遇到“new 一个对象发生了什么”这种题要能说清四步创建空对象、链接原型、绑定 this、返回对象。2.2 浏览器与网络原理常考但容易被忽视浏览器原理这块小米的笔试明显是花了心思的。题目不会直接问“浏览器渲染流程是什么”而是给你一个场景比如“某页面首屏加载很慢分析可能原因”。这种问法需要你把 HTTP 缓存、资源加载、DOM 解析、CSS 阻塞、JS 阻塞这些知识点串成一条线。我的复习思路是自问自答几个核心问题从输入 URL 到页面显示中间发生了什么强缓存和协商缓存的区别是什么服务端怎么控制CSS 会阻塞 DOM 解析吗JS 会阻塞吗什么情况下会导致重排reflow和重绘repaint这几个问题如果能不看资料完整答出来浏览器部分基本就稳了。特别是 HTTP 缓存我建议大家把Cache-Control的no-cache、no-store、max-age等指令的实际效果区分清楚笔试选择题特别爱考这个。另外ETag和Last-Modified的优先级关系也要记住ETag 优先因为它是文件内容的哈希比时间戳更精确。跨域问题也是必考项。CORS 的简单请求和预检请求区分、Access-Control-Allow-Origin的配置、JSONP 的原理这些都要能手写。我备考时把 JSONP 的实现完整默写过一遍function jsonp(url, callbackName) { return new Promise((resolve, reject) { const script document.createElement(script); script.src ${url}?callback${callbackName}; window[callbackName] (data) { delete window[callbackName]; document.body.removeChild(script); resolve(data); }; script.onerror () reject(new Error(JSONP request failed)); document.body.appendChild(script); }); }2.3 CSS 不只是写样式还要懂布局原理CSS 在笔试中的比重通常没有 JS 大但小米这场笔试还是体现了对布局基本功的重视。flex 布局和 grid 布局是绝对重点特别是 flex 的三个核心属性flex-grow、flex-shrink、flex-basis的配合计算。我面试时经常问候选人“一个 flex 容器里有两个子元素各自的 flex 值分别是 1 和 2剩余空间怎么分配”很多人答不准确就是因为没有真正看过 flex 布局的计算过程。BFC块级格式化上下文也是一个高频考点。我建议从“是什么、怎么触发、有什么用”三个角度来准备特别是应用的场景清除浮动、防止 margin 塌陷、阻止元素被浮动元素覆盖等。笔试可能会给你一段代码问“为什么这里会出现 margin 塌陷怎么解决”如果你只记得overflow: hidden而说不清原理就容易被扣分。层叠上下文也是容易出题的隐藏考点。position: relative和z-index: -1的组合、transform会创建新的层叠上下文这些细节只有真正写过复杂页面的人才能第一时间反应过来。我见过不少候选人在这里翻车。2.4 框架与工程化从“会写组件”到“懂原理”2021年前端笔试对框架的考察已经不只是“会不会写 Vue/React 代码”了而是开始考察原理级理解。小米这场笔试虽然没有直接让手写 Vue 源码但场景分析题里考察了虚拟 DOM 的理解、diff 算法的基本思路、响应式数据的实现方式。我在准备 Vue 部分时重点是搞清楚三条主线响应式系统是如何工作的Object.defineProperty vs Proxy虚拟 DOM 是什么为什么要引入它组件的更新流程从 setter 触发到 DOM 更新中间发生了什么对于 React重点则是 hooks 的实现原理和 fiber 架构的基本概念。这里我建议大家不要只背“useEffect 在渲染后执行”要能解释清楚为什么依赖数组变化才会重新执行、为什么 hooks 不能写在条件语句中。这类理解题在笔试中的区分度非常高。工程化方面webpack 的原理、Loader 和 Plugin 的区别、Tree Shaking 的原理是考察重点。我当时专门整理了一个对比表格把 Loader 和 Plugin 从“定位、作用、执行时机”三个维度做了区分。Module Federation 这类微前端相关概念如果能答得出来会是一个很好的加分项。3. 手写题与算法题的实操记录3.1 高频手写题不是会写是要写对写稳手写代码题是笔试中让很多人头疼的部分因为平时工作大多是看代码、调代码很少从头到尾写完整函数。2021年小米这场笔试的手写题没有超出常规范围但每个题都有几个隐性加分点踩中了比“写出来”更重要。防抖和节流是最高频的手写题之一几乎属于必考。我建议不要只背模板要理解两者的核心差异防抖是“事件停止触发后 delay 时间执行”节流是“一段时间内只执行一次”。写法上还要注意this指向和参数透传完整版本应该是function debounce(fn, delay) { let timer null; return function(...args) { clearTimeout(timer); timer setTimeout(() { fn.apply(this, args); }, delay); }; }这个版本用了剩余参数和apply来保留上下文是面试官最愿意看到的写法。手写Promise是我建议必须能走一遍的题。虽然笔试不一定每次都考但写一遍 Promise 能帮你把微任务、状态机、链式调用这些概念全部串起来。我当时的做法是先实现一个只支持then的简化版再逐步加上catch、finally、all、race。核心的状态流转是pending - fulfilled或pending - rejected状态一旦改变就不可逆这个机制和事件循环的配合要理解透。深拷贝也是手写题中的常客。要区分写的是浅拷贝还是深拷贝要考虑数组和对象的判断、循环引用的处理、特殊类型Date、RegExp、Map、Set的处理。我当时用的版本已经考虑了这些边界function deepClone(target, map new Map()) { if (target null || typeof target ! object) return target; if (map.has(target)) return map.get(target); const isArray Array.isArray(target); const result isArray ? [] : {}; map.set(target, result); if (isArray) { target.forEach((item) { result.push(deepClone(item, map)); }); } else { Object.keys(target).forEach((key) { result[key] deepClone(target[key], map); }); } return result; }有些同学会问手写题到底要不要背我的答案是“不仅要背还要理解着背”。因为笔试现场时间紧张如果你现场去推理每一步的逻辑很容易写不完整或者出现低级的语法错误。提前把高频题写到肌肉记忆的程度才能给算法题和场景题留出足够的时间。3.2 算法题的难度分级与取舍策略算法题是很多前端同学的软肋但这并不意味着我们要花几个月时间去啃算法。2021年小米秋招前端方向的算法题难度大概是 LeetCode 中等偏下水平重点考察链表、二叉树、数组操作、字符串处理、排序查找这些基础数据结构。我的策略是分类准备把常见题型按“必拿分”和“努力拿分”分级必拿分题数组去重、字符串反转、回文判断、两数之和、数组扁平化、二叉树遍历。这些题思路简单、代码量小只要刷过一遍就能写出来。努力拿分题链表的反转与合并、二叉树的层序遍历、动态规划入门题爬楼梯、打家劫舍。这些题需要理解核心思路建议每个专题刷 5-10 道做到能独立写出思路清晰、没有语法错误的代码。笔试中最忌讳的是死磕难题。如果一道题想了 10 分钟还没有完整思路立刻放弃或先写暴力解。我见过太多人在一道中等偏难的算法题上花费 20 分钟导致后面的手写题和场景题没时间写这是典型的战略失误。笔试不是竞赛拿到尽可能多的分才是目标。3.3 我在笔试现场的实际答题顺序我给自己定的答题顺序是先做选择题和填空题因为这类题速度快、确定性高能快速建立信心然后做手写代码题趁脑子还清醒把 JS 功底展示出来再做场景分析题这类题需要完整思路放在中间认真写最后留时间做算法题直接做有把握的难题用暴力解兜底。这个顺序的关键逻辑是“分数确定性优先”。你永远不会因为一道算法题没做完而失败但会因为手写题写出了低级错误而丢分。选择题不用担心时间不够遇到不确定的先标记跳过回头再想不要恋战。另外我强烈建议在开始答题前花 2 分钟通读一遍全部题目把所有题目的难度和时间预估记在心里。这样写前面题目的时候心里有数哪些题的耗时应该压缩哪些题值得深入。4. 常见问题与避坑实录4.1 审题不清是真的会丢分我在复盘那场笔试时发现最容易丢分的不是不会做的题而是看错条件、答非所问的题。比如题目明确说“用 ES5 实现”你非要写const和箭头函数题目说“写出输出结果”你却写成了“这段代码的作用”题目说“至少写出两种方案”你只写了一种。这些小细节看似微不足道但会直接影响阅卷体验。阅卷人希望快速看到你的答案是否切题如果你的答案和题目要求错位即使内容再漂亮也难以给分。建议在笔试时用排除法对照题目要求答完一道题后重新读一遍题干核对三个信息——题目的关键词实现/优化/解释、约束条件ES5/不能使用 XX、输出要求代码/输出结果/解决过程。这个过程只需要 30 秒但能避免至少 20% 的无效失分。4.2 环境与工具使用上的细节坑在线笔试平台最容易出问题的是环境相关的问题。我当时遇到的一些情况现在整理出来给大家提个醒部分笔试平台不支持console.log查看中间变量导致调试手写题时看不到输出结果。这时候建议在本地编辑器写好再粘贴但要注意本地可运行不代表平台支持所有语法。Node 版本不一致可能导致某些 API 不可用。笔试平台如果默认 Node 版本较老optional chaining?.和空值合并??可能会报错。保险起见手写题尽量用 ES6 及以下语法。有些平台要求代码不能有语法错误否则整题不给分。写完后花一分钟检查括号、分号、变量名是否一致这个检查能救回很多分。我还建议大家提前熟悉常用的笔试平台操作比如牛客网的代码编辑器、赛码网、ShowMeBug 等。有些平台支持本地代码自动补全有些完全裸奔提前适应平台会让你在考场上更从容。4.3 心态与时间管理上的常见问题笔试时候最容易犯的错误是“恋战”。遇到一道有思路但还没完全想通的题总觉得再想几分钟就能写出来结果 10 分钟过去了还没动笔。我的经验是如果一道题超过 10 分钟没有进展立刻跳到下一题做完整张卷子后再回头捡。另外要注意的是笔试的最后一两道题往往是压轴的场景分析题需要留出足够的思考时间。如果前面题目耗时太长后面的大题只能匆匆写几行得分率会很低。我建议每道选择题最多 1-2 分钟手写题最多 10 分钟算法题最多 15 分钟超过时间就做标记跳过。最后的技巧是“把能拿的分拿全”如果你不会写完整代码写清楚思路步骤用伪代码描述也可以得到部分分。很多笔试平台是人工阅卷或机考加人工复核你的思考过程和解题思路是会被看到的。不要因为不完美就直接留白写了就有机会。5. 针对 2026 年大厂前端笔试的新趋势观察虽然这篇文章的引子是 2021 年小米秋招前端方向第一场笔试但为了让今天的读者有更好的参考价值我再聊聊最近几年大厂前端笔试的变化趋势这些趋势其实在 2021 年的题目中已经露出了苗头。2021 年的笔试题里开始出现工程化场景题和框架原理题这几年这种趋势明显加速。现在的笔试题目开始大量结合真实工程需求比如“如何设计一个前端错误监控系统”“如何优化一个包含大量图片的列表页面”“如何设计一个带权限控制的路由方案”。这类题目没有标准答案考察的是你的技术方案设计能力、对性能指标的敏感度、对用户体验的判断力。第二个趋势是 TypeScript 和工程化工具链的权重上升。几年前笔试中 TS 可能只是加分项现在几乎成了必考项手写一个类型工具函数比如PartialT、PickT, K的实现已经出现在多场笔试中。第三个趋势是 AI 辅助开发工具的影响。2025 年以来不少公司的前端笔试开始允许使用 AI 工具完成部分题目但与此同时题目本身的深度和综合度也提高了。基础题可以通过 AI 快速完成但综合场景题和方案设计题依然需要候选人具备完整的知识体系和独立思考能力。这也意味着大家对知识点的理解深度比死记硬背更重要。所以我的核心建议是把基础打牢把原理搞懂把常见的场景题多做一些思考。面试和笔试的形式会变但考察的本质不会变——你是否能在真实的工作场景中解决实际问题。我个人在实际操作中的体会是准备前端笔试最好的方式不是刷题刷到吐而是给自己营造一个“模拟工作”的心态。拿到一道题先想“这是工作中的什么场景”再想“我怎么下手解决”。这样练出来的思路在笔试中能稳定发挥在真正的面试和工作中也经得起考验。最后再分享一个小技巧平时做题时养成写注释的习惯把思路和关键决策点写在代码里。笔试时这些注释能帮阅卷人快速理解你的方案还能帮你自己理清思路一举两得。