ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

百度2019前端笔试卷考点拆解:从JavaScript到算法实战

2026/8/29 23:15:55 拓冰建站 浏览量
百度2019前端笔试卷考点拆解:从JavaScript到算法实战 很多准备校招的同学看到“百度2019校招Web前端工程师笔试卷第二批”这个标题第一反应是找原题、背答案。但我更建议把它当成一份“考点地图”来用。这份试卷的题目设置很有代表性几乎覆盖了当年大厂校招前端笔试的全部核心维度JavaScript基础、浏览器与网络、CSS布局、框架原理、算法与数据结构每一类都能在今天的笔试题里找到影子。哪怕你现在投的不是百度刷透这套题背后的知识点也能摸清大部分互联网公司前端笔试的出题风格。这篇文章我会从命题逻辑出发把这份试卷涉及的考点逐个拆开讲清楚再按同样的风格整理一份模拟卷带你把每道题的解题思路和踩坑点过一遍。无论你是正在备战秋招的应届生还是打算转行做Web前端的开发者只要能把文章中这条主线吃透应付校招笔试基本就够用了。1. 这份笔试卷背后的考察逻辑从试题设计看大厂要什么人1.1 为什么值得啃一份两年前的校招试卷很多人会问前端技术更新这么快2019年的题目还有参考价值吗我的看法是非常值得看而且要细看。前端框架可能年年变但校招笔试考的核心能力一直很稳定JavaScript语言功底、浏览器工作原理、网络基础、CSS布局能力、计算机基础素养。以JavaScript为例当年考的作用域、闭包、事件循环、Promise现在依然是面试必问题目。浏览器渲染机制、HTTP缓存策略、跨域解决方案这些知识在今天的实际开发中反而更加重要。至于框架题2019年确实是Vue 2.x最成熟、React刚推出Hooks的节点试卷里关于Vue响应式原理、虚拟DOM diff的考法放到现在依然是理解Vue 3和React 18的基石。所以这份试卷真正的价值不在于题目本身新旧而在于它帮你划出了一条清晰的备考主线。与其漫无目的地刷几套新题不如把这份试卷涉及的知识点逐个吃透效果会好得多。1.2 试卷整体结构与知识点权重分配根据我的经验复盘这类校招笔试卷一般由四部分构成单选题、多选题、填空题和两道左右编程题。整体难度属于“广而不深”要求你在有限时间内快速判断并作答留给编程题的时间通常比较紧张。知识点的权重分布很有规律我整理了一个大致比例供参考考察方向大致占比典型考点JavaScript基础35%闭包、this指向、原型链、事件循环、数组方法浏览器与网络20%HTTP缓存、渲染机制、跨域、Web安全HTML与CSS15%盒模型、BFC、flex布局、居中方案算法与数据结构15%字符串处理、数组操作、排序、简单递归框架与工程化15%Vue/React原理、组件通信、模块化、构建工具这个分布透露了一个信号大厂要的不是“会用某个框架的人”而是“JavaScript和浏览器基础扎实、遇到问题能快速定位并解决的人”。框架知识只是加分项真正决定你能否通过笔试的往往是最基础的那部分。1.3 大厂校招笔试的命题思路与筛选逻辑每次校招季大厂收到的简历数以万计笔试的第一要务是高效筛选。所以命题有三个明显原则。第一个原则是广度优先。题目要覆盖尽量多的知识点用极少的题量考察出候选人的知识面。这解释了为什么笔试题经常一道题里混合多个考点比如把作用域、闭包和事件循环揉在一个输出题里。第二个原则是深度次之。笔试不追求让你写一个完整的项目而是通过几道有区分度的题看你能不能把某个知识点往深了说。比如考察Promise简单的考法是“Promise是什么、怎么用”进阶考法是“then里面抛异常和reject有什么区别、错误会被谁捕获”。后者才是真正筛选人的题目。第三个原则是反套路。命题人很清楚考生会刷题所以题目会刻意加一些反直觉的细节让只会背答案的人露馅。比如CSS居中方案网上能查到十几种但题目加上“父元素高度不固定”这个条件很多背答案的人就懵了。明白了这三点你就知道备考重点不是背答案而是把每个知识点背后的“为什么”搞清楚。下面我按考点类别逐个拆解重点和易错点。2. 核心考点拆解Web前端校招笔试的高频“雷区”与得分点2.1 JavaScript基础语言理解而不是语法背诵JavaScript是前端笔试的绝对大头但大部分考生挂就挂在“以为自己会了”。讲几个最常考也最容易被绕进去的点。第一个是闭包和作用域。经典题目是for循环里用var声明变量循环内setTimeout打印i问输出什么。答案不是0到9而是连续输出10个10。因为var没有块级作用域循环结束后i已经变成10所有setTimeout回调共享同一个i。改成let之后每次循环都会创建一个新的绑定输出才会变成0到9。这道题考察的其实是“闭包捕获的是变量而不是值”这个本质。如果能把为什么let能做到这一点讲清楚比背答案有用得多。第二个是this指向。常考规则有普通函数调用时this指向window或undefined方法调用时指向调用者箭头函数不绑定this而继承外层作用域构造函数通过new调用时指向新对象。坑点通常出在“把对象方法取出来再调用”和“回调函数中的this”这两种场景。我的建议是把this的判断规则整理成一个决策树看函数是怎么被调用的而不是函数定义在哪里。箭头函数则完全不同它遵循词法作用域规则看的是定义位置的this。第三个是事件循环。Promise、setTimeout、async/await混合输出的题目十份试卷里至少出现三次。考察的核心是同步代码先执行微任务队列在宏任务之前清空每个宏任务执行完都会检查微任务队列。你把这三个规则记住了再复杂的输出题都能推出来。但要注意Promise构造函数里的代码是同步执行的只有then和catch里的回调才是异步的这个点非常容易错。第四个是常用数组方法和字符串方法。题目往往不会直接问“map和forEach有什么区别”而是问“请实现一个数组扁平化”或“请用reduce实现数组分组”。这就考察你不仅要会调用API还要理解API内部的工作机制。备考时建议把map、filter、reduce、flat、slice、splice这些方法各写一遍手写实现写完之后你对这些方法的理解会上一个台阶。2.2 浏览器与网络从输入URL到页面渲染这条主线浏览器与网络部分最大的复习技巧是抓住一条主线从输入URL到页面渲染完整经历哪些步骤。这个问题把DNS解析、TCP连接、HTTP请求、浏览器渲染进程、HTML解析、CSS解析、JavaScript执行全部串了起来笔试里很多零散的知识点都能挂在上面。先看HTTP缓存。题目经常问“强缓存和协商缓存的区别”关键记忆点是响应头里的Cache-Control决定强缓存ETag和Last-Modified决定协商缓存。强缓存命中直接走本地缓存不发送请求协商缓存命中会发送一次请求服务器返回304浏览器使用本地副本。有一个高频考点很多人记反Cache-Control的max-age单位是秒no-cache的意思是“使用缓存前必须验证”不是“不使用缓存”而no-store才是真正的不缓存。这两个词就差一个字母含义差别很大。再看跨域。笔试常考JSONP和CORS。JSONP的原理是利用script标签不受同源策略限制通过动态创建script发送请求服务端返回一段调用指定回调函数的JavaScript代码。它的局限是只能发GET请求不能处理错误状态。CORS则是通过服务器返回Access-Control-Allow-Origin等响应头来允许跨域。考点通常是“哪些情况会触发CORS预检请求”比如自定义头部或非简单请求时就会触发OPTIONS预检。还有一类必考题目是重绘和重排。记住重排一定会引起重绘重绘不一定引起重排。修改元素的width、height、margin、display会导致重排修改color、background、visibility只会导致重绘。高频优化问题是“哪些操作会强制同步布局”比如读取offsetHeight/offsetWidth之前如果修改了样式就会强制浏览器先执行一次布局计算。这个知识点在笔试里出现频率高实际开发也容易踩坑。Web安全方面XSS和CSRF也是常客。XSS的核心是“用户输入被当作代码执行”所以要对输入做转义过滤CSRF的核心是“伪造用户请求”所以要校验请求来源、使用Token。笔试里喜欢给出一个攻击场景让你判断类型做题时先区分“恶意代码注入页面”和“冒用身份发起请求”就好判断了。2.3 CSS与页面布局看似送分实则拉分CSS在笔试里的地位很微妙大部分考生觉得会写页面就能过结果一做题才发现选择题里每个选项看起来都对。CSS部分最值得深挖的知识点有三个方向。BFC相关题目是重灾区。考察方式包括什么是BFC、如何创建BFC、BFC可以解决什么问题。BFC的全称是块级格式化上下文可以把它理解成页面中的一块独立渲染区域区域内部的布局不会影响外部外部也不会影响内部。创建BFC的方式有float不为none、position为absolute或fixed、display为inline-block或flex、overflow不为visible。常考的应用是解决margin上下塌陷和清除浮动。做题时看到“高度塌陷”“margin合并”这些词优先往BFC方向想。居中方案几乎是必考题而且题目会越来越刁。简单版是水平垂直居中一个固定尺寸的元素用flex三行代码搞定。进阶版会加限制条件父元素高度不固定、子元素宽度不固定、不能用flex、兼容IE8。实际工作中90%的场景flex就够了但笔试考多个方案的目的是看你的知识储备。我建议至少准备四套完全不同的方案并理解各自的前提条件flex布局、绝对定位加负margin、绝对定位加transform、table-cell加vertical-align。每种方案的适用场景和优缺点都要能说清楚。CSS选择器优先级也是一个高频考点。基本排序是!important 内联样式 ID选择器 类/属性/伪类选择器 元素/伪元素选择器 通配符。但真正的难点是计算复合选择器的权重比如“div .class:hover”这类组合怎么比较。我常用的方法是将选择器写成(a, b, c)三元组的形式分别代表ID数、类数、元素数然后逐位比较。这个方法笔试很实用。移动端适配在2019年的试卷里已经开始出现现在的笔试题里更是常客。核心知识点是viewport、rem与em的区别、像素比dpr。记一条核心公式移动端布局中1rem等于根元素font-size的大小通过媒体查询或JavaScript动态调整根元素font-size就能实现页面等比缩放。至于为什么不能用px直接写是因为不同设备逻辑像素和物理像素存在偏差这个点能说出来就证明你真的理解移动端适配。2.4 框架与工程化考察的是思考深度2019年的框架题确实带有时代印记比如Vue 2.x的Object.defineProperty响应式原理React 16的setState合并策略。但这些题目的本质到今天依然适用。Vue方向的高频题是“响应式原理”和“组件通信”。响应式原理的核心是Vue在初始化data时通过Object.defineProperty将数据属性转换成getter/setter并在getter中收集依赖、setter中触发依赖更新。题目常问“Vue 3为什么改成Proxy”答案在于Proxy可以拦截对象新增属性和删除操作而Object.defineProperty做不到。这个对比如果只是背下来很容易忘我的建议是实际手写一个5行代码的defineProperty响应式示例亲眼看到数据变化触发视图更新就永远不会忘。组件通信的考点比较固定props/$emit用于父子通信事件总线或Vuex用于跨级和兄弟通信。答题时要能说出各自的适用场景和缺点。React方向的经典考题是setState是同步还是异步、虚拟DOM的diff过程。这两个问题问的不是使用API而是原理理解。setState在React事件处理器内是异步的在原生事件和setTimeout里是同步的这个特性与React的批处理机制有关。虚拟DOM diff重点在于同级比较、key的作用、O(n)复杂度的优化策略。答题时建议从小例子说起不要只背结论。工程化方向常考的包括Webpack的构建流程、Loader和Plugin的区别、CommonJS与ES Module的区别。一个容易丢分的点是Loader和Plugin的区别我习惯这样记Loader负责模块转换本质是一个函数输入文件内容输出转换后的内容Plugin负责解决Loader解决不了的事本质是一个带有apply方法的类通过钩子参与整个构建流程。用一句话说Loader是“翻译官”Plugin是“调度员”。2.5 算法与数据结构没有捷径但有规律很多前端同学对算法题有畏难情绪觉得平时写业务代码用不上。但校招笔试不同算法题是硬性门槛而且大厂出题往往有规律主要集中在几个固定类型。字符串类字符串反转、字符串去重、最长公共前缀、回文判断。这些题难度不大但考得很细重点在于边界条件的处理比如空字符串、只有一位字符串、全相同字符。数组类数组扁平化、去重、排序、两数之和。数组扁平化是高频中的高频至少会三种写法正则法、reduce法、flat方法并说清楚各自的复杂度。链表与二叉树反转链表、判断链表是否有环、二叉树前中后序遍历。校招笔试一般不会考到太复杂的树形DP但二叉树遍历是高概率题需要掌握递归和迭代两种写法。动态规划以简单题为主比如斐波那契数列、爬楼梯、最大子数组和。这类题目不会太难但考察你的基础思维能力。建议至少练熟“用动态规划求解爬楼梯”并理解为什么暴力递归会超时、加一个数组做记忆化搜索就能解决。算法题真正的得分点不只是“做出来”还要“做规范”。变量命名清晰、考虑入参为空或异常、注释写出核心思路、时间复杂度和空间复杂度分析都能拉开差距。我见过不少候选人代码能跑通但边界条件一个不处理面试官对代码质量的评价就会降低很多。3. 实战演练按第二批笔试卷风格重做一份模拟卷为了让你更直观地感受这类笔试卷的节奏我按照当年百度第二批试卷的出题风格整理了一份复习样本。这份样本参考了常见校招笔试题型结合我对前端笔试考点的理解重建而成不是原卷但考点分布和难度梯度高度接近可以直接用来做自测。3.1 模拟卷的题型设计与难度分布整体题量参考“90分钟完成”的标准来设计题型题量单题分值总分数建议用时单选题1033020分钟多选题542015分钟填空题521010分钟编程题2204040分钟单选题考察基础概念多选题喜欢考察“哪些说法正确”容易漏选和错选分值占比高所以需要谨慎。编程题一道偏JavaScript语言能力一道偏算法逻辑都是前端岗最常考的题型。3.2 选择题典型例题与解题思路下面列出几道代表性的题目和解析你可以先自己思考再看答案。题目一以下代码输出什么console.log(1); setTimeout(() console.log(2), 0); Promise.resolve().then(() console.log(3)); console.log(4);考察点事件循环、微任务与宏任务执行顺序。解析同步代码先输出1和4微任务队列中的Promise回调会先于宏任务队列中的setTimeout回调执行所以接着输出3最后输出2。答案就是1、4、3、2。易错分析不少人以为setTimeout的延迟是0就会立即执行忽略了它被放入宏任务队列等待下一轮循环的事实。这个例子是事件循环中最基础也最经典的考题。题目二下列哪种方式不能触发浏览器的重排A. 修改元素的width属性B. 修改元素的color属性C. 添加或删除DOM节点D. 修改元素的display属性为none考察点重绘与重排的触发条件。解析width是布局相关属性改它会引起重排添加或删除节点会影响页面布局也会引起重排display为none会让元素脱离文档流同样重排。color只影响绘制结果不改变布局所以只触发重绘。正确答案是B。题目三关于HTTP缓存说法正确的是A. Cache-Control的no-cache表示不使用缓存B. 强缓存命中时HTTP状态码为200C. ETag属于强缓存字段D. 协商缓存命中时服务器返回200并携带新数据考察点HTTP缓存机制的核心概念。解析no-cache的意思是“使用缓存前必须向服务器验证”并不是不使用缓存A错强缓存命中时直接使用本地缓存状态码确实显示为200from memory cache或from disk cacheB对ETag是协商缓存字段C错协商缓存命中时服务器返回304 Not Modified不携带新数据D错。正确答案是B。易错分析no-cache和no-store的区别、ETag属于强缓存还是协商缓存是两大高频易错点建议反复记忆。题目四下列哪些情况会创建BFCA. float: leftB. position: relativeC. display: flexD. overflow: hidden考察点BFC的触发条件。解析float不为none会创建BFCA对position为absolute或fixed会创建BFCrelative不会B错display为flex会创建BFCC对overflow不为visible时会创建BFChidden当然算D对。正确答案是ACD。3.3 编程题典型例题与完整实现编程题是笔试的决胜局这里选两道最能检验前端基本功的题目分别对应“业务开发中的函数封装”和“数据处理能力”。题目一实现一个防抖函数debounce要求支持立即执行选项。function debounce(fn, wait 300, immediate false) { let timer null; let isInvoked false; return function (...args) { const context this; if (timer) { clearTimeout(timer); } if (immediate !isInvoked) { fn.apply(context, args); isInvoked true; } else { timer setTimeout(() { fn.apply(context, args); isInvoked false; timer null; }, wait); } }; }考察点this指向、闭包、apply调用、边界条件。解析外围的timer和isInvoked是闭包变量每次调用返回函数时它们都会被复用。immediate为true时第一次调用立即执行后续连续调用不会重复触发直到停止调用超过wait毫秒后isInvoked被重置。这段代码里最关键的是fn.apply(context, args)保证原函数内部this不被错误改变。题目二实现一个函数将任意嵌套的数组扁平化并去重。function flattenAndUnique(arr) { const result []; function flattenHelper(list) { for (const item of list) { if (Array.isArray(item)) { flattenHelper(item); } else if (item ! undefined item ! null) { result.push(item); } } } flattenHelper(arr); return [...new Set(result)]; } const input [1, [2, [3, [2]], 4], [5], 6, [undefined], [[7]]]; console.log(flattenAndUnique(input)); // [1, 2, 3, 4, 5, 6, 7]考察点递归、数组方法、Set去重、空值处理。解析核心思路是先递归遍历所有层级将非数组元素收集到result中然后利用Set对结果去重。很多考生会用数组自带的flat(Infinity)但在笔试中手写递归更能体现对数据结构的理解。代码里过滤了undefined和null这是一个加分点说明你考虑到了脏数据对结果的影响。3.4 评分视角什么样的答案能拿到高分编程题虽然是机器跑用例但一部分公司会人工复核笔试代码面试环节也会围绕你的代码提问。从阅卷和面试官视角看高分代码普遍有四个特征。第一是正确性。所有测试用例都能跑过包括边界用例。第二是鲁棒性。入参可能为空、类型可能不正确代码要做兜底处理。很多人漏掉这一点丢分很可惜。第三是复杂度合理。不需要最优解但至少要分析出当前解的时间复杂度能用哈希表就不该用双层循环。第四是代码规范。变量命名有语义、缩进整洁、必要注释解释思路。笔试代码不要求像工程项目一样分文件组织但基本可读性要有。4. 备考避坑指南与实战经验笔试之后的下一站4.1 校招笔试最常见的三类失误第一类失误是时间分配失衡。有的人在单选题上反复纠结一道题卡了十分钟导致后面编程题只剩二十分钟明明会做也写不完。笔试题量大每题分值都有限陷入纠结时最理智的选择是先标记、后跳过、有空再回来做。第二类失误是概念混淆。最常见的是把HTTP状态码的含义记混、把不同缓存字段的归属记错、把重排和重绘的触发条件搞反。这类问题有一个共同原因只背了结论没有理解机制。考前我建议把易混淆概念整理成一张对照表反复看三遍以上。第三类失误是编程题不处理边界。函数传入了空数组、空字符串、null、undefined、嵌套层级很深的数据很多人的代码一跑就挂。一个很有效的自测习惯是写完代码后追问自己三句话如果入参是空我的代码会怎样如果数据量极大会不会超时如果数据里有脏值会不会报错把这个习惯带到考场上能避免大量失分。4.2 时间分配与做题策略我推荐的做题节奏是“先总览、再分块、最后攻坚”。拿到试卷先花两分钟快速浏览全部题目对整体难度做到心里有数。然后按题型顺序做基础选择题快速作答不会的果断跳过编程题留足时间先读懂题意再写代码。编程题的具体策略是“先暴力、再优化、后补边界”。遇到不会的题先用最直白的方式写一个能跑的解法保证拿到基础分再想有没有更优的复杂度。很多考生一上来就想最优解结果卡住写不出来丢掉了本来能拿的分。写完之后剩下时间优先用来补充边界条件因为一个用例挂掉可能就会扣掉大部分分数。还有一个小技巧如果题目要求设计一个方案而不是写代码那么一定要分条作答、把关键词先写出来。阅卷时间很紧张关键词清晰能帮你拿到更多步骤分。4.3 笔试后的复盘方法与面试衔接笔试结束并不代表这件事就完了。我强烈建议在考后两小时内趁记忆还清晰把试卷题目按知识点整理成一份“失分地图”。格式很简单题目描述、考察知识点、你的答案、错误原因、正确思路。从实际效果看做一次完整复盘比做三套新题收获更大。如果你通过了笔试接下来大概率会进入面试环节面试官常做的一件事是拿着你的笔试代码或试卷内容追问思路。所以你在笔试时写的每一道编程题都要准备好在面试里讲清楚“为什么这么写”和“有没有更好的方案”。这也是我前面强调代码要自己写、要写规范的原因。从这份试卷折射出的备考主线来看我的体会是真正能帮你拿到offer的不是刷题的数量而是把核心知识点一个一个抠明白的深度。如果你现在正在准备前端校招与其到处找新题做不如先把手边这份经典试卷里的每一个考点吃透。把JavaScript基础、浏览器网络、CSS布局、框架原理和算法基本功这几条线串起来你会在笔试时发现很多题目都是老朋友。