十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

58集团前端秋招笔试复盘:题型分布、高频考点与机试技巧

58集团前端秋招笔试复盘:题型分布、高频考点与机试技巧 秋招那会儿我在牛客网刷到的58集团前端岗内推帖投完简历没几天就收到了笔试通知。58的笔试属于那种“看着不难做起来处处是坑”的场次既有基础八股又有需要落手写代码的机试整体风格偏实用比较考察候选人平时到底有没有真正写过代码。这篇文章把2023年58集团秋招前端岗笔试的全过程整理出来包含题型分布、高频考点、机试实操思路和踩坑记录给准备参加前端秋招或实习笔试的同学做个参考。不管你是在校生还是准备跳槽的社招前端这篇复盘都能帮你快速对齐大厂笔试的考察维度。1. 笔试前传从投递到笔试通知的关键节点1.1 岗位选择与简历投递策略我是2023年8月底投递的58集团前端岗。58集团旗下有58同城、安居客、转转、赶集网等业务线前端岗位主要放在技术工程平台群和各个业务线下面投递时需要注意分清具体是哪个部门的岗位因为不同业务线的笔试题目侧重点会有差异。我当时投的是集团核心的前端岗位收到笔试邀请后邮件里明确写了笔试形式为在线编程加选择题混合语言不限但前端岗位建议使用JavaScript答题。简历投递这里有一个容易被忽略的点58的招聘官网和牛客网是同步的笔试通知会通过邮件和短信同时下发所以邮箱、手机都要保持畅通垃圾邮件文件夹也要定期翻一翻。我当时有个同学就是因为没看到邮件错过了笔试找HR说明情况后才额外补了一场但不是人人都这么幸运秋招节点错过一场笔试可能就错过整个流程了。提示投递时尽量提前确认业务线。我当时注意到58同城主站的前端岗笔试题偏重业务场景和工程化安居客侧偏重移动端适配和性能优化而中台类岗位更偏重组件库和工具链。虽然都是前端但笔试时你只能凭印象答题所以投递前想清楚自己想做什么方向比盲投十家公司更有胜算。1.2 笔试形式与平台准备58集团2023年秋招前端岗笔试采用的是牛客网在线考试系统考试时长为90分钟全程开启摄像头监控。这个设置意味着你得提前准备一台带摄像头的电脑并且考试环境要安静、光线充足中途不能有人进出。在线笔试对网络稳定性要求很高建议用有线网络代替Wi-Fi我在笔试前特意试了三次网络连通性把浏览器缓存清了还把其他会占网速的软件全部关掉。除了环境我对牛客网的做题界面做了一次完整的熟悉。牛客网的在线编辑器默认支持JavaScript、Python、Java、C等语言前端岗自然选择JavaScript。编辑器没有自动补全也没有eslint提示这意味着你平时依赖IDE的程度一旦过高笔试时就会原形毕露。我自己在笔试前一周专门用牛客网的模拟题练习了手写代码强迫自己脱离IDE背书式的写函数这样到真正笔试时才不会因为大小写拼写错误浪费时间。2. 试卷结构与时间分配一份笔试的真实构成2.1 题型分布总览2023年的试卷结构我到现在还记得比较清楚整体分成三块选择题、简答题、编程题。选择题一共20道单选和多选混在一起多选少选不得分这比纯单选要难受得多。题目覆盖了HTML/CSS、JavaScript基础、浏览器原理、网络协议、Vue框架、前端工程化等内容。简答题是一道手写题要求实现一个前端场景下的工具函数当时考的是防抖和节流的结合实现。编程题有两道一道是算法题一道是场景题。分值分布大概是选择题40分简答题15分编程题45分。从这个占比就能看出来代码能力是绝对的核心光靠背八股过不了笔试。我印象最深的是选择题里居然考了一道CSS的BFC块级格式化上下文判断题还有一道关于HTTP缓存优先级的选择题这两道题都属于那种“背过就秒选没背过就全靠猜”的类型。2.2 时间分配策略与实战经验90分钟做20道选择题加3道主观题时间其实比较紧张。我的策略是先快速扫描一遍所有题目把会做的选择题在10到15分钟内全部做完遇到卡壳的直接标记跳过不恋战。然后是简答题留20分钟左右写代码最后留45分钟给编程题。实际操作中我选择题用了大概18分钟因为有几道多选题需要反复推敲。简答题我写了15分钟编程题两道一共花了50分钟最后一分钟才调完第二道题的边界条件属于惊险过关。这里分享一个时间分配的小技巧编程题不要上来就写代码先花两分钟在草稿纸上梳理输入输出、边界条件和算法思路把思路写在注释里再开始写代码这样即使最后代码没写完阅卷人也能看到你的思路能挽回一部分分数。我第二道编程题就是先写了算法思路注释虽然实现时有几个小问题但整体方向是对的。提示牛客网的笔试系统支持切换题目但切换时不会自动保存代码这一点非常坑。我第一道编程题写了十几行后发现思路有问题切换到其他题目再切回来时代码还停留在最初的状态等于白写。所以写编程题时要么一次性写完再切走要么每写一个关键节点就手动“保存”一下如果系统提供的话。3. 理论考点深度拆解那些年踩过的JS坑3.1 JavaScript基础高频陷阱这一部分是选择题的重灾区。58的笔试对JavaScript基础的考察颗粒度很细不是简单问“闭包是什么”而是直接给你一段代码让你判断输出顺序。我印象深刻的几道题第一题考了this指向。题目给了一个对象方法里嵌套定时器的场景问定时器回调里this指向谁。这道题的经典陷阱在于很多人知道普通函数里this指向调用者但定时器回调通过全局环境调用时非严格模式下this会指向window严格模式下是undefined。题目选项里还混了一个“指向对象本身”的干扰项如果对箭头函数和普通函数的区别不够敏感很容易掉坑。第二题考了事件循环的输出顺序。代码大概是Promise.resolve().then、setTimeout、async/await混合的一段程序要求写出输出顺序。这类题目只要掌握微任务先于宏任务执行的规律再加一层await后同步代码的执行顺序分析基本能拿下。但58这里多挖了一个坑await后面跟的如果是一个Promise会多出一轮微任务的延迟很多人没有意识到这一点导致输出顺序整体错位。第三题考了类型转换。我记得有一道题问[] ![]的结果是什么以及null undefined的结果。这类题目属于八股中的八股但放在多选题里就变难了因为选项会给出多个类似的表达式让你判断对错一个犹豫就容易多选或者漏选。我的经验是的隐式转换规则必须背熟尤其是对象转原始值时valueOf和toString的调用顺序面试笔试都很爱考。3.2 浏览器与网络协议考点浏览器原理和网络协议在58笔试中占了大概五道选择题的份额。这里重点考察HTTP缓存机制、浏览器渲染流程、跨域解决方案和Web安全。HTTP缓存那题我记得很清楚问的是“强缓存和协商缓存的优先级”。选项里给出了Cache-Control、Expires、ETag、Last-Modified四个头的不同组合让选出浏览器实际会生效的缓存规则。正确答案是Cache-Control优先于ExpiresETag优先于Last-Modified但很多同学只记住了强缓存优先于协商缓存忽略了两类缓存内部还有优先级关系。这种题目如果平时不实际抓包看请求头光看不复习真的容易丢分。跨域那题考得比较常规给出几种跨域方案让选出正确说法。CORS、JSONP、postMessage、WebSocket都是常见选项这里比较容易错的是把JSONP说成支持POST请求实际上JSONP只能通过动态script标签实现GET请求。另外一个坑是CORS的简单请求和预检请求区分题目会在选项里故意混淆Content-Type: application/json是简单请求还是预检请求答案是application/json会触发预检。浏览器渲染流程的选择题问的是“以下哪种方式会触发重排”。选项包括修改width、修改color、修改transform、修改visibility。正确选项是修改width一定触发重排transform不会触发重排会触发合成color和visibility触发重绘但不触发重排。这道题其实在考察渲染流水线和性能优化基本功也是实战中经常用到的知识点不只是应试。3.3 框架与工程化综合考点58集团的笔试对框架的考察比较均衡Vue和React都会涉及但更偏向Vue因为58主站很多系统基于Vue构建。试卷里有一道关于Vue响应式原理的选择题问的是“Vue 2中Object.defineProperty和Vue 3中Proxy哪个说法正确”。选项分别涉及监听数组下标变化、监听对象新增属性、性能对比和兼容性。这个题目正确答案是Vue 3的Proxy可以监听对象新增属性和删除属性而Vue 2无法监听。备选项里故意写了“Proxy比defineProperty性能更好”这个绝对化表述实际上Proxy并不绝对更快这里考察的是对原理的理解深度而非记忆。工程化部分考了一道Webpack的loader和plugin区分题问“以下哪个是loader的作用”。选项包括“打包压缩JS”、“将ES6语法转换为ES5”、“生成HTML文件”、“启动本地开发服务器”。正确答案是“将ES6语法转换为ES5”但很多人会误选“打包压缩JS”因为压缩确实发生在构建阶段容易和loader混淆。实际上loader的核心职责是模块转换压缩是插件或内置优化器做的。还有一道关于模块化规范的题问CommonJS和ES Module的区别。这个题目考察加载时机、静态分析和循环引用处理。常见误区是认为ES Module同步加载实际上ES Module是静态导入、异步加载而CommonJS是同步加载。循环引用方面CommonJS通过缓存机制处理ES Module通过实时绑定处理两者的容错性差异也值得了解。我来整理一下理论考点中真正值钱的复习清单这些也是我笔试后复盘时总结出来的重点事件循环微任务和宏任务的嵌套、await的额外微任务延迟this指向默认绑定、隐式绑定、显式绑定、new绑定的优先级闭包和垃圾回收闭包导致内存泄漏的场景、WeakMap的清理机制HTTP缓存强缓存和协商缓存的完整优先级链跨域方案CORS预检请求、JSONP限制、postMessage适用场景Vue响应式Vue 2与Vue 3的差异、Proxy的监听能力边界Webpack构建loader和plugin的职责区分、打包优化手段4. 机试实操环节从题目到AC的全过程4.1 机试环境与代码编辑器配置编程题使用牛客网内置的JavaScript运行环境这里需要先理解它的输入输出模式。牛客网不像LeetCode那样把函数签名给你而是让你自己写标准输入读取也就是使用readline模块读取标准输入再用console.log输出结果。很多同学第一次用牛客网做前端笔试会很懵因为平时刷LeetCode习惯了对LeetCode风格函数式编程到牛客网环境里反而不适应。建议在笔试前用牛客网的模拟题库练两道标准输入输出的题。核心代码模板大概是const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on(line, function (line) { const tokens line.split( ); // 处理逻辑 console.log(result); });笔试时第一道编程题会给出明确的输入输出格式描述比如“第一行输入一个整数n第二行输入n个整数输出排序后结果”。如果你不熟悉readline的用法光是处理输入输出就要浪费至少十分钟这在90分钟的考试里非常致命。4.2 两道典型编程题的完整解题思路2023年的第一道编程题是算法题题目大意是给定一个整数数组和一个目标值找出数组中两个数之和等于目标值的下标组合要求时间复杂度尽量低。这道题看起来就是LeetCode第一题的“两数之和”但牛客网版本的输入格式是第一行输入数组长度 n 第二行输入 n 个整数用空格分隔 第三行输入目标值 target输出要求是返回两个下标从0开始按升序排列如果不存在则输出-1 -1。解题思路很直接使用哈希表存储遍历过的数值和下标遍历数组时判断target - nums[i]是否存在于哈希表中如果存在则找到答案否则将当前数值和下标存入哈希表。时间复杂度O(n)空间复杂度O(n)。我当时写了大概这样一段代码const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout }); let lines []; rl.on(line, (line) { lines.push(line.trim()); if (lines.length 3) { const n parseInt(lines[0]); const nums lines[1].split( ).map(Number); const target parseInt(lines[2]); const map new Map(); let result [-1, -1]; for (let i 0; i n; i) { const complement target - nums[i]; if (map.has(complement)) { const j map.get(complement); result [Math.min(i, j), Math.max(i, j)]; break; } map.set(nums[i], i); } console.log(result.join( )); rl.close(); } });这里有一个细节lines.length 3的判断隐含了数组长度为n的信息但题目可能有多余的空行。我在实际笔试时第一版代码就因为在空行处理上没做判断导致读入的lines数组长度不对程序输出异常。后来加了一个if (line ) return;的过滤逻辑才修复。这个教训说明笔试时一定要考虑各种边界和异常输入而不是只针对样例数据。第二道编程题是场景题题目大意是实现一个函数对传入的数组进行去重并且保持元素的原始顺序要求不能用Set和filter这类高封装API。这道题的本质是考察手写基础算法的能力也是很多大厂前端笔试的常客。我的思路是使用双重循环加一个标志位或者用一个对象作为哈希表。不用Set的情况下用对象存储已出现过的元素类型判断是否重复function uniqueArray(arr) { const result []; const seen {}; for (let i 0; i arr.length; i) { const item arr[i]; const key typeof item _ item; if (!seen[key]) { seen[key] true; result.push(item); } } return result; }这里有一个隐藏的考点如果数组里同时存在数字1和字符串1只用seen[item]做判断会错杀所以我用typeof item _ item构造了一个带类型的唯一键。这个细节是我当时灵光一闪想到的事后复盘发现应该就是出题人想考察的“数据类型区分”意识。这道题还有一个延伸如果数组元素是对象如何做深比较去重题目没有深入但在简答题里有类似的影子。58的笔试会更倾向于把基础知识和实际场景结合所以我建议准备这类题目时不要只刷LeetCode还要做一些偏业务的手写题。4.3 边界处理与代码质量提升技巧编程题的边界条件处理是笔试拉开差距的关键。我在第二道题里就犯了一个典型错误没有考虑数组为空或者只有一个元素的场景。虽然这道题空数组不会报错但如果后续代码里用到了arr[0]这种访问就会返回undefined而不是给出明确的错误提示。阅卷时会根据测试用例打分边界条件不过就会扣分。我的手写代码规范是先写注释列出输入输出和边界情况再写主体逻辑最后回来补校验。比如这道题我的注释大概是这样// 输入arr 数组 // 输出去重后的新数组不改变原数组保持顺序 // 边界空数组返回空数组包含不同类型元素要区分这样写的好处是即便最后代码没写完阅卷人也能从注释里看到你的思路完整性。还有一个细节是牛客网的JavaScript环境是Node.js不是浏览器环境所以window对象不可用也没有document。如果笔试时不小心写下window.setTimeout这类代码运行时会直接报错白白丢分。5. 常见问题与踩坑记录5.1 笔试现场高频出错点根据我和身边同学的反馈58前端笔试中最常见的错误集中在几个地方。第一是选择题里的多选漏选。牛客网的多选题会明确说“少选得一半分多选不得分”这就导致很多人为了保底只选一个最有把握的选项结果那题本身正确答案就有两个白白损失一半分。我的策略是如果能排除一个错误选项剩下的全部选上如果不能排除宁可选最确定的选项。第二是编程题超时。很多算法题会卡时间复杂度如果你用了O(n²)的暴力解系统会在测试用例上报告超时。我第一道题一开始想用双重循环暴力解后来发现题目数据规模可能是10的5次方级别暴力解必挂才改成哈希表。笔试时一定先看数据范围再定方案如果题目没给范围也要下意识选择最优解。第三是环境不适应。牛客网的编辑器不支持代码折叠也没有智能缩进手写多行嵌套函数时缩进容易乱。这里建议平时练手时就把代码风格固定下来不要依赖IDE的格式化工具。5.2 备考经验与资源清单笔试结束后我复盘了整张卷子的考点发现高频考点其实非常集中完全可以提前准备。我的备考经验是把LeetCode热题100里的数组、字符串、链表、二叉树类型的题目刷两遍重点练“两数之和”“三数之和”“最长无重复子串”“反转链表”这类经典题前端基础方面把JavaScript高级程序设计红宝书里的闭包、原型链、异步编程、事件循环四章重读一遍配合前端面试题的题库做刷题练习框架方面把Vue的响应式原理、生命周期、组件通信、路由原理四块内容吃透React的Hooks原理和状态管理也要能说出基本思想。资源上比较推荐的是LeetCode热题100作为算法手感的日常维护牛客网的“前端岗位笔试真题”板块可以用来熟悉各大厂的笔试风格前端面试题汇总类的GitHub仓库用来快速过八股红宝书的异步和对象章节用来深挖JS基础在我看来笔试准备的核心不是背题而是建立一套“看到题目就能定位考点”的反射。比如看到“数组去重”立刻想到哈希表、类型区分、保持顺序看到“两数之和”立刻想到哈希表优化看到“手写防抖”立刻想到定时器的清除和参数透传。5.3 从笔试到面试的衔接准备如果顺利通过笔试接下来就是业务流程面试。58的面试通常会考察你在笔试里的思路尤其是机试题的优化空间。所以笔试结束后不要马上把题目忘掉我在笔试结束当天就把两道编程题重新写了一遍整理了暴力解、最优解和边界条件形成了笔记这在后续面试中帮了大忙。面试官很喜欢问一类问题“你笔试的第二道题如果没有限制Set你会怎么实现”这其实是想看你是否真的理解去重的本质而不是只会背API。我当时把Set去重的原理讲了一遍又对比了对象哈希和Map的区别面试官明显比较认可。另外58的面试还会考察项目经历和工程设计能力比如“如果让你设计一个前端监控系统你会怎么做”。这类问题和笔试题的关联不大但笔试中涉及的缓存、渲染性能、框架原理都是回答这类问题的素材。所以笔试不只是笔试它也是面试的复习提纲。6. 复盘总结这套笔试题到底在考什么把整张卷子拆开看58集团2023年秋招前端岗笔试的筛选逻辑其实非常清晰选择基础扎实但不死板的人选择能独立手写代码、能处理边界场景的人选择具备工程化思维的人。三道主观题都不算难但每一道都暗含了关键细节而这些细节只有真正写过代码、踩过坑的人才答得出来。我个人在实际操作中的体会是大厂前端笔试越来越不满足于“知道原理”而是要求你“能写出来、能处理异常、能分析复杂度”。这对应的是实际业务开发中最基本的能力你不仅要会用框架还要能理解框架背后的设计不仅要写功能还要考虑性能、边界和可维护性。最后再分享一个实际有用的技巧机试时如果某道题卡住了可以先写一个能跑通示例数据的暴力版本保证基础分拿到手再花剩余时间优化。我第二道题就是因为先写出了可运行的版本才在最后几分钟里从容补上了边界判断。笔试的容错率很低合理分配时间、保住基本盘比追求完美解法更实际。
返回列表