尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

2017美团前端笔试题解析:从闭包到webpack的核心考点

2017美团前端笔试题解析:从闭包到webpack的核心考点 2017年美团秋招前端开发工程师B卷到现在还有人在翻这道题的解析可见当年这份笔试题在圈子里有多大的参考价值。那会儿正好是Vue 2.x刚火起来、ES6全面普及、前端工程化从“会配webpack”到“能优化webpack”过渡的档口笔试题目既考基础功底又考实战经验比现在很多背题就能过的面试不知道高到哪里去了。这篇文章我以过来人的视角把这份笔试的题型结构、核心考点、解题思路和当年的踩坑复盘完整拆给你看。不管你是准备校招还是社招想补基础这份内容都值得认真过一遍——它基本就是2017年前端开发面试题的一个浓缩样本放到今天也依然是前端技能树的骨架。1. 真题整体复盘题型分布与考察逻辑先说结论这份试卷的考察重心很清晰JavaScript基础占了大头浏览器与网络次之框架和工程化紧随其后CSS布局和移动端适配也有一席之地。题型以选择题、填空题、代码输出题、简答题和手写代码题为主题量不算大但每一道都有深度几乎没有送分题。1.1 为什么这份试卷值得反复研究美团当年的前端笔试有一个特点不考死记硬背的API而是考“你平时写代码时到底有没有思考过为什么”。比如闭包、this指向、事件循环这类题目表面上是语法题实际上是在考你对JavaScript运行机制的理解颗粒度。很多同学刷题时只记结论不追原理一到变体题就懵这个坑我当时也踩过。另外一个值得注意的点是这份试卷对框架的态度比较克制。React和Vue都有涉及但没有像现在这样“不会框架就没法做题”更多是考框架背后的设计思想比如数据响应式、虚拟DOM、组件通信等。这说明当时的考察逻辑还是以“前端基础学习能力”为主框架只是工具不是壁垒。1.2 各模块分值占比与命题趋势根据当年考生回忆和题目流传版本各模块的考察比例大概是这样的考察模块预估分值占比典型题型JavaScript基础作用域、闭包、this、原型链30%代码输出、选择题异步与事件循环10%代码输出、排序题浏览器与网络缓存、渲染、安全20%简答、选择题框架与工程化15%简答、手写代码HTML/CSS 与移动端适配15%选择题、代码题数据结构与算法10%手写代码这个分布放在2017年是合理的前端岗位还处在“一专多能”的阶段既要懂页面又要懂逻辑还要能处理网络和兼容性问题。对比现在的笔试题框架比重明显上升算法题难度也陡增但核心基础模块的考察逻辑基本没变——越基础的东西越能看出一个工程师的长期潜力。2. JavaScript 核心考点闭包、this 与异步队列这一块是整份试卷的“主战场”也是区分度最高的部分。我当时在考场上的感受是题目不难但每个选项都像是对的每个输出结果都让你想改答案。这恰恰是出题人的高明之处——用最基础的知识点制造最深的陷阱。2.1 闭包与作用域链的典型考法闭包几乎是每一家前端笔试的标配考点美团这份也不例外。我记得有一道题是给出一段循环内用var声明变量并注册定时器的代码问最终输出什么。答案是连续输出n个最大值而不是0到n-1。这题的核心在于var声明的变量是函数级作用域循环结束后变量已经累加到最终值而闭包捕获的是同一个变量引用定时器执行时读到的当然是最终值。这类题的解法有几种用let声明块级变量、用立即执行函数传参、或者用bind绑定当前值。我在解析时更喜欢这么理解闭包捕获的是“变量环境”而不是“变量的值”只要记住这一点所有闭包相关的输出题都不会错。再往深一层美团当年的题还喜欢结合函数声明与函数表达式的提升顺序来考。这里有一个易错点函数声明会整体提升而var声明的变量只会提升声明部分赋值留在原地。二者的提升优先级也不同函数声明先于变量声明。这组规则是所有“预解析”题型的基础理解之后做题全靠推理不需要背。2.2 对象属性访问与原型链优先级还有一个高频考点是new操作符做了什么。我当时在考场上的答题思路是分成四步创建一个新对象、把新对象的原型指向构造函数的prototype、把构造函数的this绑定到新对象上执行、如果构造函数显式返回对象则返回那个对象否则返回新对象。美团出题一般不会直接问你new的原理而是给一段代码让你判断实例属性、原型属性、构造函数属性的访问顺序。访问顺序的规则很简单实例自身属性优先其次是原型链上的属性最后才到Object.prototype找不到就是undefined。有一道变体题我记得很清楚在构造函数的prototype上定义了一个方法然后实例上又定义了同名方法最后问实例调用的是哪一个。答案是实例自身的因为属性查找是先看实例再看原型。这个规则放到继承场景里就是“就近原则”。2.3 事件循环与输出顺序判断异步这块美团喜欢出混合题——把setTimeout、Promise、async/await放在同一段代码里让你写出最终的输出顺序。2017年async/await已经进入主流视野所以这类题目并不超纲。这里有一个万能的分析框架我一直沿用到现在先跑完整段同步代码遇到异步操作就记下它的类型和回调。微任务队列优先级高于宏任务队列promise.then和queueMicrotask排在微任务里setTimeout/setInterval排在宏任务里。await右边的表达式会立即执行await后面的代码会被当作微任务延后。一轮宏任务执行完后清空当前所有的微任务再去执行下一个宏任务。我记得有一道题是把setTimeout(() console.log(1), 0)、Promise.resolve().then(() console.log(2))、async function里的一串await输出混在一起。如果按照以上框架推输出顺序是先同步再微任务最后宏任务。掌握了这个框架这类题基本是稳拿分的。3. 浏览器与网络缓存、渲染与安全浏览器章节在2017年的笔试里占比不低因为当时的前端开发对性能优化和安全问题的关注度正在快速上升。美团作为重业务、重体验的互联网公司对这部分知识考察得很细。3.1 HTTP缓存机制与强缓存、协商缓存的判断有一道经典的简答题给出的场景是“图片资源更新后用户仍然看到旧图片分析可能原因并给出解决方案”。这题考察的就是HTTP缓存机制。我当时把思路整理成了三层强缓存阶段请求命中Cache-Control的max-age和Expires浏览器直接使用本地副本会返回200 (from disk cache或from memory cache)。协商缓存阶段强缓存过期后浏览器带上If-Modified-Since或If-None-Match重新请求服务器服务器根据Last-Modified或ETag判断资源是否变化没变就返回304。请求头控制在文件URL后面加版本号或hash值比如a.js?v1.0.1强制刷新缓存。遇到“更新后用户看到旧资源”的问题先确认服务器响应头里是不是缓存时间设得太长再检查文件名有没有变化最后看是不是通过CDN分发时缓存没有刷新。顺着这个排查逻辑答题基本不会漏分。3.2 浏览器渲染流程与回流重绘优化渲染机制的题美团喜欢结合性能优化一起考。核心知识点是从HTML到页面展示要经过DOM解析、CSS解析、构建渲染树、布局计算、绘制合成这几步。其中布局计算对应回流绘制对应重绘。回流的代价远高于重绘因为布局变化需要重新计算元素的位置和尺寸。有一道优化题我印象很深列出至少三种减少回流的方案。常规答案会有使用transform代替top/left做动画、批量修改样式使用class或cssText、元素脱离文档流后再操作、使用DocumentFragment批量更新DOM、减少使用table布局。这题本身不难但很少有人能答到“transform不会触发回流只会触发合成”这个深度能答出来说明是真的调过优。3.3 前端安全XSS与CSRF的防御手段安全模块在2017年的校招笔试中已经频繁出现美团的题目问得比较直接什么是XSS攻击、如何防范。我当时答的是三块输入过滤、输出转义、CSP内容安全策略。XSS的本质是未经过滤的用户输入被当作代码执行了所以前提是不信任任何用户输入在输出到HTML时要对尖括号、引号等特殊字符进行转义。CSRF的考题一般是问防御手段。标准答案是验证请求来源、使用CSRF Token、自定义请求头验证、对敏感操作进行二次验证。这两类安全题的答题逻辑不复杂但前提是你真的理解攻击发生的机制而不是背防御列表。4. 框架与工程化Vue/React、模块化与构建2017年的前端笔试已经绕不开框架了但美团这份卷子考的是“框架的设计思想”而不是“某个API的用法”。这意味着如果你只是用过框架而不理解原理这部分得分会很惨。4.1 Vue响应式原理与数据绑定关于Vue的题最核心的是问“数据响应式的实现原理”。这里要答清楚Object.defineProperty的作用通过getter收集依赖通过setter触发更新。每个响应式数据都对应一个Dep依赖收集器组件渲染时会触发getter从而把Watcher收集到Dep里数据变化时触发setterDep通知所有Watcher更新。当时还有一道变体题问为什么Vue 2不能直接监听数组下标的变化。这是一个实操性很强的问题因为Object.defineProperty对数组的索引劫持在性能上有很大问题所以Vue 2重写了数组的七个方法push、pop、shift、unshift、splice、sort、reverse来实现响应式。知道这个背景你就能理解为什么Vue 2里用arr[1] xxx不会触发视图更新而arr.splice(1, 1, xxx)可以。4.2 虚拟DOM与diff算法的核心逻辑虚拟DOM相关题目在2017年已经出现美团问的是“为什么需要虚拟DOM以及diff算法如何优化比较过程”。答题时我建议分两层第一层是虚拟DOM能够将真实DOM操作抽象成对象操作减少直接操作真实DOM带来的性能消耗第二层是diff算法通过同层比较、key唯一标识、tag判断等策略将时间复杂度从O(n³)降到O(n)。还有一个细节是key的作用美团有一道选择题就考了这个在列表渲染中用index作为key有什么隐患。答案是在列表顺序变化或头部插入时index会变化导致组件状态错乱。这说明出题人不仅考你有没有用过key还考你是否理解key在diff中的角色。4.3 模块化、webpack与前端工程化工程化题目在2017年集中考察CommonJS与ES Module的区别以及webpack的基本原理。两者最大的区别是静态与动态ES Module是静态编译期确定依赖关系可以摇树优化tree-shakingCommonJS是运行时加载模块之间是拷贝关系。我当时在这块总结了一个答题模板先输出模块化解决的核心问题全局变量污染、依赖关系混乱再说明CommonJS和ES Module的语法和加载时机差异最后带一句webpack通过loader处理非JS资源、通过plugin扩展构建能力。这样既有深度又有广度面试官看完就知道你不是背的。5. CSS布局与移动端适配细节CSS在高端前端笔试中占比不多但考得一定不会太浅。2017年正好是flexbox开始大规模普及、Grid还没完全成熟的阶段所以美团的CSS题基本围绕flex布局和移动端适配展开。5.1 经典三栏布局的多种实现有一道题是“用至少两种方式实现左右定宽、中间自适应”的三栏布局。我一般答三种方案flex布局父容器display:flex左右固定宽度中间flex:1。浮动布局左右分别float:left和float:right中间设置margin-left和margin-right。绝对定位左右和中间都设置position:absolute左右分别left:0和right:0中间设置left和right。这道题考察的是你是否理解不同的布局方式及其适用场景而非单一方案。实际业务中flex方案是最稳的因为代码少、易维护、不需要清除浮动。但笔试时多写几种能体现你的CSS广度。5.2 rem适配、viewport与移动端1px问题移动端适配的套路题是考rem的原理。这里有一个核心公式rem 根节点的font-size移动端适配的本质是把视口宽度与根节点的font-size成比例映射。比如设计稿宽度是750px我们把根节点的font-size设置为视口宽度的1/10再去量取设计稿尺寸换算rem就能实现按比例缩放。1px问题的产生原因是高清屏的devicePixelRatio大于1CSS的1px在物理像素上会被放大。解决思路用media query判断devicePixelRatio通过transform: scale(0.5)或者使用边框图片。还有一种我比较推荐的方式把border放在伪元素上然后scale整个伪元素。6. 面试官视角答题技巧与考点延展最后一部分我从另一个角度来聊——如果我是出题人我会希望看到什么样的答案。这个问题想清楚了做题的方向感就会大不一样。6.1 简答题的“三层作答法”美团笔试的简答题我推荐三层作答法第一层给结论或定义让阅卷人一眼看到你会第二层给原理或过程证明你不是背的第三层给实际场景或示例体现你真正用过。举个例子问到“什么是闭包”普通同学写的是“函数嵌套函数内部函数可以访问外部函数的变量”进阶同学会补充“闭包会保留对外部作用域变量环境的引用可能导致内存泄漏解决方式是及时置null”最好的同学还会说“在实际开发中用闭包封装私有变量、实现柯里化、设计单例模式都是常见场景”。这种答题框架是通用的不需要背题只要掌握了知识点的底层逻辑任何变体都能套。6.2 手写代码题的边界处理手写代码是笔试中最容易拉开分差的环节能力边界和安全检查是评委最看重的两点。比如手写防抖函数除了setTimeout和clearTimeout的核心逻辑还要考虑this指向、参数透传、立即执行选项、取消取消防抖这几个边界。我习惯统一写一个版本function debounce(fn, wait, immediate false) { let timer null; return function(...args) { const context this; if (timer) clearTimeout(timer); if (immediate !timer) { fn.apply(context, args); } timer setTimeout(() { fn.apply(context, args); }, wait); }; }写完之后我还会口头补充一句频繁点击场景如果不是想延迟执行而是想限制最小触发间隔应该用节流而不是防抖。这句话能体现你对这两个概念的辨析不只是会写函数。另外手写深拷贝是2017年笔试的高频题美团也出现过。第一步判断基础类型直接返回第二步判断数组和对象分别创建容器第三步用for-in遍历并递归拷贝第四步针对Date、RegExp做特殊处理还有循环引用的问题需要WeakMap解决。能写到第四步基本就是满分答案了。6.3 从笔试看能力成长路径整理完这份试卷我最深的感受是一道好的前端笔试题一定不是让你背答案的而是让你展示思考过程的。美团的这份2017秋招真题虽然时间过去了好几年但它对核心能力的要求并没有过时——JavaScript语言的理解深度、浏览器底层机制的掌握程度、框架原理的认知水平、工程化实践的经验积累这四条线仍然是今天前端开发面试的主干。如果你现在还在准备笔试阶段我建议按照这个顺序去补先把JavaScript核心概念刷到“能给别人讲明白”的程度再去看浏览器原理和网络安全框架题重点理解设计思想而不是API最后用工程化和算法题查漏补缺。按照这个路径走下来应付的不只是美团一家而是大多数主流互联网公司的前端笔试。最后再分享一个小技巧刷题时不要只看答案一定要把每道题对应的知识点发散出去形成自己的理解框架。比如遇到一道this指向的题就把call、apply、bind、箭头函数、new绑定都理一遍遇到一道缓存题就把强缓存、协商缓存、Service Worker、CDN缓存都过一遍。这样才能保证你做一道题会一类题而不是背一道题。
返回列表