网易校招前端笔试全解析:考点地图与高效备考策略
1. 网易校招前端笔试到底考什么:一场非典型的“知识体检”
每年秋招季,网易的校招笔试都是前端岗位投递热度最高的几场之一。2020年这场正式批笔试,我印象非常深——它不算特别难,但覆盖面出奇地广,几乎把前端工程体系里所有核心环节都拉了一遍。那天考完之后,很多人在群里吐槽“复习了三个月框架原理,结果被一道CSS题问住了”,也有人因为是第一次用牛客网的在线IDE写算法题,慌了神,连“回文判断”都没AC。
如果你准备参加今年的校招或社招,其实不必纠结“这是哪一年的题”,因为网易乃至整个互联网大厂的校招题目,考察逻辑多年未变:基础扎实、原理清楚、手写不慌、思路能讲明白。真正有价值的是把这张卷子里蕴含的知识地图拆开,看它反推出的一套前端工程师能力模型是什么。
先说几个核心观察:
- 题型非常固定:单选、多选、编程题。单选和多选一般占60-70分,编程题一到两道,占30-40分。没有简答题,也没有让你写设计文档的题目。
- 选择题考得很“散”:从HTML语义化到浏览器缓存,从事件循环到Vue响应式原理,从HTTP状态码到Webpack打包流程,覆盖面极广。
- 编程题难度中等偏基础:通常不考复杂的图论或动态规划,而是偏“逻辑+字符串+数组操作”,但要求你写出可运行的完整代码,边界情况要处理干净。
这也解释了为什么笔试结束之后,大家的体验两极分化。复习时只盯着“面经里常问的面试题”的人,往往在选择题上翻车;而认真把整个前端知识体系重过一遍的人,即使编程题没完全AC,选择题也能把分数拉回来。
所以我更愿意把这份笔试卷子看作一张知识体检单:它不考验你有多深的研究能力,而是考验你的知识面是否完整、基础概念是否准确、写代码是否形成肌肉记忆。下文按考察维度拆开讲,每个维度我都补了原理分析和实操经验,方便你直接拿去对标复习。
2. JavaScript语言基础:选择题的“重灾区”与手写题的“基本功”
2.1 变量提升、闭包和this指向:概念题的高频命题点
网易的笔试卷子里,JavaScript基础部分几乎占了选择题的30%以上。高频考点集中在这几个方向:
变量提升与暂时性死区(TDZ)
var、let、const的区别是必考题,但网易很少直接问你“区别是什么”,而是给你一段代码,让你判断输出:
var a = 1; function foo() { console.log(a); var a = 2; console.log(a); } foo();这段代码输出undefined和2。第一行console.log(a)不会报错,是因为var a被提升到了函数作用域顶部,但赋值没有提升,所以值是undefined。如果把它换成let a = 2,第一行就会直接抛ReferenceError,因为进入了暂时性死区。这个区别理解了,基本就不会错。
闭包与循环中的经典陷阱
另一个高频题是循环里用var定义变量地创建异步任务:
for (var i = 0; i < 5; i++) { setTimeout(() => console.log(i), 100); }输出是5, 5, 5, 5, 5。原因是var是函数作用域,循环结束后i变成了5,所有回调共享同一个i。用let声明可以解决,因为let是块级作用域,每一次循环都会创建独立的绑定。
我在实际面试中也会问候选人这个问题,但会追加一句:“除了let,你还有哪些办法让输出变成0到4?”这里可以答IIFE(立即执行函数)传参、用Function.prototype.bind传参、或者把值存在数组里。网易的多选题很可能从这些解法里挑两个作为选项,你要能分辨哪个可行、哪个不可行。
this指向
关于this的选择题,几乎每次都会出现。核心判断逻辑就一句话:看函数如何被调用,而不是在哪里定义。
const obj = { name: 'netease', getName() { return this.name; } }; const fn = obj.getName; console.log(fn());这里输出undefined(严格模式下)或全局对象的name(非严格模式),因为fn()是普通函数调用,this指向window/global,而不是obj。只有obj.getName()这种通过对象属性调用的写法,this才指向obj。
2.2 原型链与继承:让你“画图”比让你“做题”更有效
原型链的题在网易试卷里出现率非常高,而且经常和new的实现、instanceof的原理混在一起考。
先记住一张基本对象关系图:
fn (函数对象) → Function.prototype → Object.prototype → null obj (普通对象) → Object.prototype → null Array → Function.prototype → Object.prototype → null判断题常考:[].constructor === Array、[].__proto__.constructor === Array、Array.prototype.constructor === Array,这些都是true。而[].__proto__ === Array.prototype也成立。
instanceof的原理就一句话:右边的构造函数的prototype是否出现在左边的原型链上。所以[] instanceof Object为true,因为Array.prototype继承自Object.prototype。
笔试里如果想稳妥读懂原型链的选项,我建议你把new的手写实现也复习一遍。这个手写题在很多企业的笔试里出现过,网易也有概率考:
function myNew(Constructor, ...args) { const obj = Object.create(Constructor.prototype); const result = Constructor.apply(obj, args); return typeof result === 'object' && result !== null ? result : obj; }注意Object.create这一步:它把obj的__proto__指向构造函数的prototype,完成原型链的连接。然后apply把构造函数里的this绑定到obj上,执行属性赋值。最后判断返回值:如果构造函数显式返回了对象,就以它为准;否则返回obj。
2.3 异步与事件循环:从输出顺序看你对宏任务/微任务的理解
Event Loop是前端笔试的“必考大户”,网易一般会这样出题:
console.log('script start'); setTimeout(() => { console.log('setTimeout'); }, 0); Promise.resolve().then(() => { console.log('promise1'); }).then(() => { console.log('promise2'); }); console.log('script end');输出顺序是:script start → script end → promise1 → promise2 → setTimeout。
关键点在于:同步代码执行完毕后,先清空微任务队列(Promise.then、MutationObserver),再执行宏任务(setTimeout、setInterval、I/O)。而每个宏任务执行完之后,又会检查微任务队列是否为空,为空才执行下一个宏任务。
掌握这个框架,绝大多数异步题的输出顺序你都可以推导出来。网易也喜欢把async/await混进来考:
async function async1() { console.log('async1 start'); await async2(); console.log('async1 end'); } async function async2() { console.log('async2'); } async1(); console.log('script start');这里要注意:await async2()会把async2()的返回值(一个Promise)resolve之后才继续执行后面的代码,而“继续执行”这步被放到了微任务队列里。所以输出是:async1 start → async2 → script start → async1 end。
这类题不难,但需要你在那种考试状态下保持冷静,别被嵌套的Promise搞晕。我的经验是:先在草稿纸上画出同步任务、宏任务队列、微任务队列三个栏,然后逐行“执行”代码,把输出填进去。这个习惯能帮你减少八成失误。
2.4 手写题:防抖节流、深拷贝与数组去重
网易的编程题如果只考一道,往往是“逻辑+基础API”的组合,不太会要求你默写某个框架的源码。但两道题的情况也不少,第二道可能就是基础手写题。
整理一下我认为值得反复练的手写清单:
| 手写目标 | 核心考点 | 注意事项与进阶 |
|---|---|---|
| 防抖 debounce | this绑定、闭包、定时器清理 | 支持前置调用(immediate) |
| 节流 throttle | 时间戳对比、定时器 | 支持首尾触发的配置 |
| 深拷贝 | 递归、循环引用、Date/RegExp | WeakMap记录已拷贝对象 |
| 数组去重 | Set、Map、双重循环 | 考虑NaN和对象 |
| 数组扁平化 | 递归、reduce、迭代 | 指定深度参数的写法 |
| 手写Promise | 链式调用、状态流转、异步队列 | 按Promise/A+规范实现resolve/reject |
深拷贝是我个人强烈建议你背熟的一道题,因为它看起来简单,但想写对非常难:
function deepClone(target, map = new WeakMap()) { if (target === null || typeof target !== 'object') return target; if (target instanceof Date) return new Date(target); if (target instanceof RegExp) return new RegExp(target); if (map.get(target)) return map.get(target); const cloneTarget = Array.isArray(target) ? [] : {}; map.set(target, cloneTarget); Reflect.ownKeys(target).forEach(key => { cloneTarget[key] = deepClone(target[key], map); }); return cloneTarget; }这里有两个关键点:用WeakMap解决循环引用问题(比如obj.self = obj),用Reflect.ownKeys遍历所有自有属性键(包括Symbol作为键的情况)。WeakMap的弱引用特性让它在深拷贝完成后可以被垃圾回收,不会造成内存泄漏。
笔试时间有限,如果你只能准备两个手写题,我的建议是:防抖节流和深拷贝。这两个在网易的卷子里出现频率极高,而且能体现代码功底。
3. 浏览器原理与网络知识:从输入URL到页面渲染的“整条链路”
3.1 页面渲染流程:选择题和简答题都爱考的骨干知识
网易的选择题里,浏览器渲染相关的内容也占了不小比重。你需要能把一条完整链路讲清楚:
- 输入URL,浏览器解析协议、域名、端口、路径等信息。
- DNS解析域名,获得IP地址。注意会先查浏览器缓存、系统缓存、路由器缓存,都没有才走本地DNS服务器。
- 建立TCP连接,HTTP请求发出,服务器返回HTML文档。
- 浏览器拿到HTML后,开始解析HTML构建DOM树。
- 解析过程中遇到CSS,会构建CSSOM树(CSS Object Model)。
- DOM树和CSSOM树合并,生成渲染树(Render Tree)。
- 根据渲染树计算每个节点的几何信息,进行布局(Layout/Reflow)。
- 把布局结果绘制到屏幕上(Painting)。
- 页面加载完成后,如果还有异步资源,继续加载处理。
网易经常从这条链路里抽出细节来考。比如:
- CSS是否会阻塞DOM解析?不会阻塞DOM树的构建,但会阻塞渲染树的生成,因为渲染需要CSSOM。这就是为什么CSS要尽早加载、尽量合并。
- Script标签放在哪里会影响性能?普通脚本会阻塞DOM解析,所以一般放在body末尾。但现代浏览器支持
defer和async属性,defer是延迟到文档解析完了再执行,async是下载完立刻执行。 - 重排(Reflow)和重绘(Repaint)有什么区别?改变几何信息(宽高、位置、display)会触发重排;只改变颜色、背景等样式会触发重绘。重排必然导致重绘,但重绘不一定会重排。
我当时复习时有一个笨办法:把“输入URL到页面展示”的每个步骤写成一条笔记,然后闭上眼睛复述一遍。能完整复述、不漏关键步骤,选择题基本就稳了。
3.2 浏览器缓存:从强缓存到协商缓存的判定标准
浏览器的缓存机制是网易笔试的“老朋友”,几乎每年都考。核心分成两块:
强缓存
服务器通过响应头Cache-Control(HTTP/1.1)或Expires(HTTP/1.0)告诉浏览器:这个资源在某个时间内直接使用本地缓存,不要发请求。
Cache-Control的常用值:
max-age=3600:资源在3600秒内有效。public:任何节点(包括代理服务器)都可以缓存。private:只有浏览器本地可以缓存。no-cache:不要直接使用本地缓存,需要向服务器验证资源是否过期。no-store:完全不缓存。
协商缓存
当强缓存过期(或设置了no-cache),浏览器会带着If-Modified-Since或If-None-Match向服务器再次请求,服务器根据资源是否变化决定返回200(返回新资源)还是304(继续用本地缓存)。
Last-Modified/If-Modified-Since:基于时间戳判断,精度低,如果一秒内多次修改可能判断不准。ETag/If-None-Match:基于内容hash判断,精度高。服务器会优先校验If-None-Match。
网易喜欢让你根据一组响应头判断第二次请求的行为。做题套路:先看Cache-Control有没有命中强缓存;如果没有,再判断协商缓存的条件是否触发;如果两者都没有缓存头,那就是每次都要重新请求。
3.3 跨域与常见解决方案:为什么JSONP只能GET
跨域是前端笔试必考内容,网易也不例外。核心要理解一个概念:同源策略要求协议、域名、端口三者一致,不一致的请求会被浏览器拦截。
常用解决方式有:
- JSONP:利用
<script>标签不受同源策略限制的特性,动态创建script标签,通过URL传回调函数名,服务器返回一段执行回调的JavaScript代码。它只能支持GET请求,因为本质上是一次脚本加载。 - CORS:服务端设置
Access-Control-Allow-Origin等响应头,允许特定来源的跨域请求。这是最标准、最推荐的方案。 - Proxy代理:在开发环境下通过webpack dev server或nginx做反向代理,把跨域请求转发到目标服务器,前端代码里请求的是同源地址。
- postMessage:主要用于
iframe和window.open打开的窗口之间的通信。
网易选择题的套路是:给你一个场景(比如“前端需要调用第三方接口,不支持CORS,接口只支持GET”),问哪个方案可行。如果你能明确“JSONP只能GET”和“CORS需要服务端配合”这两个边界,答案基本就能锁定。
3.4 HTTP状态码:别只记404,重点掌握1xx和3xx
浏览器网络部分还常常考HTTP状态码。网易的出题风格一般不是直接问“500是什么意思”,而是给一个网络请求的过程,让你推断状态码的变化。需要重点掌握的:
| 状态码 | 含义 | 笔试常考场景 |
|---|---|---|
| 200 | OK,请求成功 | 正常响应 |
| 301 | 永久重定向 | 域名更换后跳转新地址 |
| 302 | 临时重定向 | 未登录跳转到登录页 |
| 304 | Not Modified | 协商缓存命中,资源未修改 |
| 400 | Bad Request | 请求参数格式错误 |
| 401 | Unauthorized | 未认证 |
| 403 | Forbidden | 有认证但无权限 |
| 404 | Not Found | 资源不存在 |
| 500 | 服务器内部错误 | 后端代码异常 |
| 502 | Bad Gateway | 网关错误,后端服务未启动 |
| 504 | Gateway Timeout | 网关超时,后端处理太久 |
有一次笔试就考了这样一个场景:用户首次访问一个静态资源,服务端返回200;第二次访问带上了If-None-Match,服务端返回304。问两次请求中哪一次网络传输的时长更长?答案是第一次,因为第二次只返回响应头,没有资源本体,304的body是空的。这种题把缓存机制和状态码结合着考,我第一遍还真做错过,后来才意识到304代表“没变化,继续用缓存”,几乎没有body内容。
4. 数据结构与算法题:笔试中实际写代码的“硬仗”
4.1 编程题的题型分布与刷题建议
网易的算法编程题一般不会太偏太难,但要注意:笔试需要在限定时间内完成,而且是在牛客网或赛码网的在线IDE上,没有ide的智能提示,环境比较简陋。
从历年题目来看,频繁出现的算法题型包括:
- 字符串处理:回文判断、字符串翻转、子串匹配、字符计数。
- 数组/链表操作:数组去重、排序、删除元素、链表反转。
- 简单动态规划:爬楼梯、最大子序和、打家劫舍。
- 栈/队列应用:括号匹配、用两个栈实现队列。
- 二叉树基础:遍历、最大深度、层序遍历。
这些题目本质上都是LeetCode的简单或中等难度。如果你想针对性准备网易,可以把LeetCode高频题按“数组、字符串、链表、二叉树、动态规划”五个分类各挑20道认真刷两遍。
4.2 一道经典编程题:最长回文子串的实现与优化
我拿“最长回文子串”这道题举例,它是很多大厂笔试的常客,网易也有过类似题目。暴力解法是遍历所有子串,再判断是否是回文,时间复杂度O(n^3),在笔试里必超时。更稳妥的做法是中心扩展法,时间复杂度O(n^2):
function longestPalindrome(s) { if (!s || s.length < 2) return s; let start = 0, maxLength = 1; const expandAroundCenter = (left, right) => { while (left >= 0 && right < s.length && s[left] === s[right]) { const currentLength = right - left + 1; if (currentLength > maxLength) { maxLength = currentLength; start = left; } left--; right++; } }; for (let i = 0; i < s.length; i++) { expandAroundCenter(i, i); // 奇数长度的回文 expandAroundCenter(i, i + 1); // 偶数长度的回文 } return s.substring(start, start + maxLength); }这里有两个关键点需要说明:
为什么中心要分奇偶两种情况?回文串的长度可能是奇数也可能是偶数。奇数长度回文的中心是一个字符,偶数长度回文的中心是两个字符之间的空隙。中心扩展法从每个可能的中心向两侧扩展,所以必须两者都考虑。
为什么记录start和maxLength而不是直接返回子串?因为每次扩展都可能更新最长结果,用指针记录比每次substring切分再比较的代价小得多。面试官或阅卷系统看你写的代码时,也会看重这种细节处理。
笔试时如果没有思路,我建议先写出暴力解保底,再尝试优化。AC一道题得全部分数,半AC也比空着强。很多在线判题系统是按“通过的测试用例比例”给分的,你能过一部分用例也能拿一部分分数。
4.3 笔试答题的“时间分配策略”:选择题别恋战
关于编程题的答题时间,我有一条经验想特别分享:不要在一道题上死磕超过30分钟。
正常一份卷子是90分钟或120分钟,编程题如果做不出来,死磕半小时可能只是浪费时间。我的策略是:
- 拿到卷子,先花2分钟扫描全部题目。
- 优先做有把握的选择题,控制在一分钟内一题,超过90秒没思路就标记跳过。
- 编程题先做自己熟悉的题目,保证AC一道。
- 最后留20分钟回来处理难题或检查。
可能有人觉得“先做编程题、再快速做选择”更快,但从分数结构来看,选择题每题少则2分、多则4分,编程题一般也就30分左右,选择题的分更容易拿。先把确定的分拿到手,再冲高分值是校招笔试的基本原则。
5. Vue/React、安全与性能优化:框架之外的综合素养考察
5.1 框架底层原理:Vue2响应式与虚拟DOM的“必背块”
网易笔试里,Vue和React的占比也很高,而且考虑到2020年这个时间节点,Vue2依然是主力,Vue3刚刚发布不久。但无论你准备的是Vue2还是Vue3,核心原理都是相通的。
Vue2响应式原理
Vue2的响应式基于Object.defineProperty,核心流程是:
- 对data的每个属性调用
Object.defineProperty,设置getter和setter。 - getter里收集依赖(订阅当前属性的watcher)。
- setter里通知依赖更新。
这里有两个常见的考点:
Object.defineProperty无法监听新增属性是它的天然缺陷,所以Vue2提供了Vue.set方法,或者你用this.$set来给对象添加新的响应式属性。数组的索引和length变化同样无法被拦截,所以arr[0] = 1不会触发视图更新,要用splice、push等方法。
Vue3的响应式用了ES6的Proxy,可以拦截对象属性的新增、删除、读取、写入,弥补了Vue2的缺陷。它还实现了Reflect配合使用,保证this指向正确。这个对比很可能出现在多选题里:问“关于Vue3响应式,正确的是哪些”。
虚拟DOM与diff算法
虚拟DOM的核心思想:用JavaScript对象模拟DOM结构,数据变化时通过对比新旧虚拟DOM,找出最小差异,再批量更新真实DOM。关键优势不是“一定比直接操作DOM快”,而是降低了手动操作DOM的复杂度、跨平台能力强(可以渲染到小程序、原生App)。
Vue2的diff算法在同层比较时使用双指针。Vue3加入了静态标记(PatchFlag),在编译阶段就能标记哪些节点的哪部分动态变化,极大提升了diff效率。笔试选择题里可能会让你判断“虚拟DOM一定比真实DOM操作快”这个说法是否正确,答案是否定的——在极小的更新场景下,虚拟DOM的diff计算开销可能反而更大,它的优势在于复杂应用下的可维护性和跨平台能力。
5.2 Vue的组件通信方式:选择题常出的“枚举题”
组件通信在前端笔试里出现频率也非常高。网易可能会这么问:“以下哪些方式可以实现Vue组件通信?”你需要能把所有方式都列出来,而且知道它们分别适用的场景。
| 通信方式 | 适用场景 | 说明 |
|---|---|---|
| props / $emit | 父子组件 | 父传子用props,子传父用$emit |
| $parent / $children | 父子组件 | 直接访问实例,耦合度高 |
| $refs | 父访问子组件实例 | 常用于主动调用子组件方法 |
| EventBus($on/$emit) | 任意组件 | 适合小规模跨层级通讯,Vue3可用mitt替代 |
| provide / inject | 祖先与后代 | 适合深层级注入,但数据不是响应式的,除非传ref/reactive对象 |
| Vuex / Pinia | 全局状态共享 | 适合中大型项目统一管理状态 |
| $attrs / $listeners | 跨层级属性透传 | 常用于高阶组件或组件二次封装 |
如果你在笔试中看到“EventBus的主要问题”这类选项,要能选出“事件名容易重复、调试困难、不适合大型项目”这类判断。
5.3 前端安全:XSS与CSRF的“攻防关系”
安全相关的题目,网易笔试也会出现,不算多,但一旦出现,就是拉开差距的题。
XSS(跨站脚本攻击)
核心是攻击者把恶意脚本注入到页面中执行。入口包括:用户输入、URL参数、富文本内容等。
防御手段主要有:
- 对用户输入进行转义(HTML转义、URL编码)。
- 使用CSP(内容安全策略)限制脚本来源。
- 对Cookie设置HttpOnly,防止通过JavaScript读取用户会话。
- 对富文本内容做白名单过滤。
CSRF(跨站请求伪造)
核心是攻击者诱导用户在已登录的网站中发起非预期的请求。比如你在某论坛登录了账号,攻击者在一篇帖子里嵌了图片链接,指向转账接口,浏览器带着你的Cookie发出请求,服务器以为是本人操作。
防御手段:
- 校验请求头中的
Origin或Referer。 - 使用Token(同步令牌或自定义请求头)。
- 敏感操作要求二次验证(比如输入验证码、支付密码)。
- SameSite Cookie属性,设置为
Strict或Lax可以很大程度阻止跨站请求携带Cookie。
笔试常考的是“判断哪些措施能防御XSS/CSRF”,你只要把两种攻击的手段和防御方式分别记牢,基本上不会错。
5.4 前端性能优化:从网络层到渲染层的“提速清单”
性能优化是前端笔试和面试都会问的内容,网易也不例外。复习时可以按下面这个层次来组织:
网络层优化
- 减少HTTP请求次数:合并CSS/JS、CSS Sprite(雪碧图)、字体图标。
- 使用CDN:让用户就近访问缓存资源。
- 开启HTTP缓存:合理配置Cache-Control和ETag。
- 开启HTTP/2或HTTP/3:多路复用、头部压缩、服务端推送。
- 资源压缩:Gzip/Brotli压缩、HTML/CSS/JS压缩、图片压缩。
渲染层优化
- 减少重排和重绘:批量修改DOM、使用
requestAnimationFrame、避免强制同步布局。 - 使用虚拟列表:长列表只渲染可视区域。
- 图片懒加载:
loading="lazy"或IntersectionObserver实现。 - CSS动画使用transform和opacity:这两个属性可以触发GPU加速,不引起重排。
构建层优化
- 代码分割:按路由懒加载,首屏只加载必要资源。
- Tree Shaking:移除未引用的代码。
- 合理使用CDN加载第三方库:比如Vue、React通过script标签引入,而不是打包到业务代码里。
有一道经典的网易选择题:页面首屏加载过慢,以下哪些方法能有效优化?选项包括“图片懒加载”“合并压缩JS/CSS”“把script标签放head里”“开启Gzip”。这里“把script标签放head里”是错误选项,因为普通脚本会阻塞HTML解析,反而拖慢首屏。这种题就是靠你对渲染链路是否真的理解。
6. 从笔试到Offer:答题策略、复盘方法与备考节奏的真实经验
6.1 考场上最容易犯的五个低级失误
我见过太多人不是因为不会做而挂掉,而是因为下面这些失误,很可惜。给你提个醒:
第一个:选择题漏选多选。网易的多选题一般会标明“少选得部分分,多选错选不得分”。但如果你不确定的选项太多,宁可选你最有把握的两个,也不要为了“多拿分”把不确定的也选上。很多系统的计分规则是“完全匹配才得分”,多选一个错的直接0分。
第二个:编程题不处理输入输出。牛客网/赛码网的题目需要你写完整的输入输出处理,跟LeetCode的“函数补全”不一样。很多人刷题只刷LeetCode,不熟悉readline来读取多行输入,结果第一题就卡在输入解析上。考前一定要去牛客网至少做两三道“输入输出”专项题练手。
第三个:JavaScript的精度问题。如果编程题里出现了大数运算,直接使用Number会溢出。2020年那次笔试有一位同学写信回文相关题目时,用parseInt解析了一串超长数字,结果精度丢失,怎么提交都对不上。处理大整数建议用BigInt,或者干脆用字符串处理,不转Number。
第四个:不处理边界条件。输入可能为空数组、字符串可能只有一个字符、目标值可能不存在。刷题时养成习惯:先判空,再判断长度是否为1,再写主逻辑。在线判题系统最爱考这些边界用例。
第五个:时间分配失衡。前面说的“选择题恋战”问题。如果一个选择题你连题目都读不懂,直接跳过,别浪费五分钟去猜——猜对的概率一般不会超过25%,把时间留给有把握的题更值。
6.2 笔试结束之后:如何复盘与准备面试
笔试结束不代表战斗结束。网易的招聘流程一般是:投递简历→笔试→技术面试(两到三轮)→HR面→Offer。笔试通过之后,面试官手里是能看到你的笔试成绩和代码的,所以笔试阶段暴露出的问题,面试环节很可能会被追问。
复盘时可以问自己几个问题:
- 哪些选择题是蒙对的?这些知识点是否真正理解?
- 编程题AC了多少?如果没能全部AC,是算法思路问题,还是输入输出处理问题?
- 哪些概念一下子想不起来(比如响应头字段、某个数组API的参数)?说明这些知识需要系统背一遍。
我特别建议你把笔试里考到的每一道题都整理成一份笔记,尤其是错题和蒙对的题。网易面试官非常喜欢追问:“你笔试那道题是怎么考虑的?”如果你能不仅说出正确答案,还能讲清楚排除错误选项的理由,会给你加分不少。
6.3 我见过的高效复习路线:四周时间足够吗
如果你还剩一个月左右准备校招笔试,可以按这个节奏走:
第一周:基础查漏。快速过一遍HTML、CSS、JavaScript基础,重点复习你平时用得少但笔试常考的部分:CSS的BFC与选择器优先级、ES6+的新特性(Promise、async/await、解构、展开运算符)、数组和字符串的常用API。
第二周:框架与网络。把Vue或React的核心原理啃下来。不需要你读过所有源码,但响应式原理、虚拟DOM、diff算法、生命周期、组件通信这些必须能讲明白。同时复习浏览器缓存、HTTP状态码、跨域方案。
第三周:算法题专项。每天保持3-5道题的刷题量,优先刷“数组、字符串、哈希表、双指针、链表”这些容易出笔试题的类型。用牛客网的校招真题模式来做,适应输入输出处理。
第四周:模拟考试与弱点补强。找两到三套历年真题,掐时间做完整模拟。做完之后把错误集中在哪几类,再回头翻对应的博客或文档补课。
这条路线不要求你每天学12个小时,但需要你每天保持一定手感。编程这件事,三天不写就手生,尤其是笔试这种需要在无IDE提示下写代码的场景,更是要形成条件反射。
6.4 一个容易被忽略的提分点:做题时留下的“思路痕迹”
最后再分享一个冷门但非常有效的技巧,尤其是在使用牛客网这类在线编程系统时:如果你在编程题里无法写出完整正确的代码,可以把清晰的注释和部分实现写在代码里。某些笔试系统的阅卷过程包括“被人工查看”,即使自动判题没有AC,面试官在翻看你的代码时,看到你思路清晰、注释完整,也会对你产生好印象。
比如:
// 思路:先排序,再用双指针从左右两端逼近 // 当前sum > target时右移右指针 // 当前sum < target时左移左指针 // 2020-09-01 笔试现场不要轻视这种“半成品”代码的价值。对于无法AC的题,它至少证明你有思路、有逻辑,而不是完全不会。在竞争激烈的校招里,一点点的印象分都可能影响“进入面试”的筛选决策。
从网易2020这场笔试往前看往后看,校招笔试的考察框架其实一直都很稳定:前端基础、JS语言、浏览器与网络、框架原理、数据结构和算法。把这张地图补齐了,考哪一年、哪一家公司,你都不会慌。
