ARTICLE DETAIL

资讯详情

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

商汤科技前端校招笔试题深度解析:从JavaScript到浏览器原理

商汤科技前端校招笔试题深度解析:从JavaScript到浏览器原理 1. 笔试整体画像商汤的卷子到底在筛什么人先聊点题外话。商汤科技做计算机视觉起家AI算法岗是绝对主力但Web前端岗位在整个业务版图里同样不可缺少——算法平台、数据标注系统、模型可视化大屏、Demo展示站、内部中后台全是前端工程师在撑。2018年校招笔试第二场这张卷子我拿到手刷完第一感觉是它并没有刻意去考AI或者计算机视觉的方向而是老老实实地在考前端基本功并且把计算机基础夹在中间一起筛人。这点很有意思。很多同学准备AI公司前端岗容易钻进“要不要准备图像处理、机器学习基础”的误区。从实际笔试反馈来看前端岗考察的重点依然围绕JavaScript语言特性、浏览器机制、网络协议、前端工程化和少量算法题展开。但相比纯互联网公司的前端卷子商汤的题会更偏向“底层原理 逻辑思维 代码落地能力”选择题里会出现一些让你分辨“真的懂”还是“背过答案”的细节题编程题也更看重边界情况的覆盖。从题型结构上看这份笔试大概分几块单选或多选的基础知识题、简答或代码补全题、一道偏算法或逻辑的中等难度编程题再加上一两道综合场景题。整体难度处在校招前端笔试的中上水平不是说题目有多偏而是它的覆盖面比较全每一块都踩在“面试官想确认你有没有形成完整知识体系”的点上。如果你正在准备类似的前端校招笔试这篇内容可以拿来当做一个自测清单对照下面拆解出来的每一类考点扪心自问一下哪些自己是真的能讲清楚哪些只是“好像见过”。我在当年复习时也走过弯路花了不少时间去看框架源码结果笔试里框架相关的直接考察并不多反而是JavaScript基础、浏览器渲染、网络请求这些“老八股”反复出现。后来我总结出的结论是AI公司前端笔试本质上是在为“能否支撑算法平台这类高复杂度业务”找底子扎实的人。2. JavaScript语言基础闭包、this、异步每一题都在挖坑2.1 闭包与作用域链的真实考法前端笔试里最不容易丢分但也最容易丢分的就是闭包。商汤这套题里有一道典型的选择题大概意思是给出一段嵌套函数问你执行结果是什么。我印象很深因为选项里每个值都设计得很有迷惑性光靠背“闭包就是函数嵌套函数”根本做不对。要知道闭包真正的考察核心是两个点一是函数声明与变量提升的顺序二是闭包捕获的是变量的引用而不是值。给你看一个典型的陷阱写法for (var i 0; i 5; i) { setTimeout(function() { console.log(i); }, 100); }如果不假思索很多人会说输出0、1、2、3、4但实际输出是5个5。为什么因为var声明的i属于全局作用域循环结束之后i已经变成5而setTimeout里的回调函数被触发时捕获的是同一个变量引用所以打印的都是最终值5。改成let声明每个循环迭代都会创建一个新的绑定输出就变成0到4了。但笔试不会只考这一层。更进阶一点的考法是考察闭包与立即执行函数IIFE的组合让你写一个计数器或者判断下面这种代码的输出var fn []; for (var i 0; i 3; i) { fn[i] function() { return i * 2; }; } console.log(fn[0]()); console.log(fn[2]());这里如果不懂“引用捕获”很容易写错。实际输出的应该是6和6因为i最终是33乘以2都是6。用IIFE包一层就能解决var fn []; for (var i 0; i 3; i) { (function(index) { fn[index] function() { return index * 2; }; })(i); }在做这类题的时候我的建议是不要只在脑子里推演拿笔把作用域链画出来。fn[i]这个函数的作用域链上挂着全局的i而不是当时循环的“快照值”这一点永远是解题的关键。笔试时间紧凑画作用域链看似慢其实是最不容易出错的路径。2.2 this指向的四种场景别被默认绑定带偏this的指向是前端笔试另一大稳定考点。这题的常见形式是给出一串对象方法调用问你this指向谁。很多同学只知道“谁调用指向谁”但遇到全局函数调用、解构赋值、回调函数这些场景就懵了。先记住一句话this指向的判定看的是函数调用方式而不是定义位置。常规情况分四种直接调用、对象方法调用、call/apply/bind调用、new调用。直接调用时非严格模式下this指向全局对象严格模式下是undefined对象方法调用时指向该对象new调用时指向新创建的对象call/apply/bind则按参数指定。但笔试喜欢绕个弯。比如var obj { a: 1, getA: function() { return this.a; } }; var getA obj.getA; console.log(getA());这里getA()是直接调用this指向全局所以打印的是undefined而不是1。如果把obj.getA()直接调用就会输出1。这个区分很多刷题少的同学会在考场上踩坑。再进阶一点会考事件回调里的this。比如DOM按钮绑定点击事件回调函数里的this指向触发事件的DOM元素但如果你在回调里又嵌套了一层普通函数那this又变了。这背后其实是“动态作用域”和“词法作用域”的纠缠。理解了这一点就不会被题目绕进去。我自己的笔试经验是遇到this题目先做一件事——把函数拿出来看它到底以什么形式被调用再决定this是谁。不要被对象字面量这种表面结构迷惑。如果代码里有bind那就直接看绑定的是什么bind一次之后this就锁死了再call也没用。2.3 异步与事件循环这道题永远是重头戏商汤的笔试第二场里异步编程相关的内容占了不少分值而且几乎每道题都和Event Loop事件循环有关。你不光要知道setTimeout、Promise、async/await各自的执行时机还要能分析它们混在一起时的输出顺序。这种题在2018年已经算主流考法了放到现在依然是面试官最爱问的。给你一个经典的混合场景console.log(script start); setTimeout(function() { console.log(setTimeout); }, 0); Promise.resolve() .then(function() { console.log(promise1); }) .then(function() { console.log(promise2); }); console.log(script end);执行顺序是script start-script end-promise1-promise2-setTimeout。为什么因为JavaScript的事件循环把任务分成了宏任务macrotask和微任务microtask。同步代码先执行然后清空微任务队列再取出下一个宏任务执行。Promise.then注册的回调属于微任务setTimeout回调属于宏任务所以微任务总是先于下一个宏任务执行。这道题的知识点可以延伸出一整个知识网络浏览器渲染机制、requestAnimationFrame的执行时机、Node.js环境下的process.nextTick优先级等。笔试大概率不会只考一个孤立题目而是会把async/await也掺进来。你只要记住一条心法await右边的表达式会立即执行await后面的代码相当于被放进了.then里属于微任务。我在实际刷题时发现很多同学栽在“认为await会阻塞整个线程”这个误解上。其实await只是让出当前协程的执行权并不会阻塞事件循环。把这个想明白配合画时间轴的技巧异步顺序题基本拿满分。建议你在草稿纸上画一条时间线每个宏任务和微任务都在时间线上占一个位置先放宏任务再插微任务最后整体读一遍正确率会高很多。2.4 原型与继承看出题人怎么挖“构造函数”的坑原型链是JavaScript里最容易“看书看懂了做题做错了”的模块。商汤这套卷子考了一道关于构造函数、原型对象和实例之间关系的题选项里还出现了constructor属性的指向问题。先说最基础的关系构造函数Foo有一个prototype属性指向原型对象原型对象有一个constructor属性指回构造函数Foo实例new Foo()内部有一个[[Prototype]]指针浏览器里可以用__proto__访问指向同一个原型对象。笔试里容易出错的地方在于如果给Foo.prototype整体赋了一个新对象constructor属性就不再指向Foo了除非手动补回来。比如function Foo() {} Foo.prototype { getName: function() { return foo; } }; var foo new Foo(); console.log(foo.constructor Foo);这里输出false因为Foo.prototype被整体替换成了一个新的对象字面量这个新对象没有constructor属性顺着原型链往上找最终找到的是Object的constructor也就是Object本身。很多人以为foo.constructor一定是Foo这就是对原型链理解不到位。关于继承的考法比较多见的是让你判断下面的对象是否能访问某个方法或者某个方法的this指向谁function Animal(name) { this.name name; } Animal.prototype.sayName function() { console.log(this.name); }; function Dog(name) { Animal.call(this, name); } Dog.prototype Object.create(Animal.prototype); Dog.prototype.constructor Dog;这里用Object.create(Animal.prototype)来建立原型链而不是直接Dog.prototype Animal.prototype避免子类和父类共享同一个原型对象导致互相污染。又把constructor指回Dog保证继承链是完整的。这种写法是笔试里标准的“寄生组合式继承”考法必须烂熟于心。我刷题的技巧是把prototype、__proto__、constructor这三者之间的关系抄成三行笔记每次遇到原型题先画三角形关系图再对照选项逐一判断。这个习惯能让你在考场上省下大量犹豫时间。3. 浏览器、网络与安全不只是背概念还要能串起来3.1 浏览器渲染流程与性能优化商汤笔试第二场里有一道关于浏览器从输入URL到页面展示的流程题选项里列了好几个步骤让你排序。这题表面上考的是渲染流程实际上是在考你对浏览器工作原理有没有建立起全链路认知。完整的流程可以简化成解析HTML生成DOM树解析CSS生成CSSOM树两者合并生成渲染树Render Tree然后经过布局Layout和绘制Paint最后合成Composite显示在屏幕上。这里容易混淆的点在于渲染树并不是简单的DOM树加CSSOM树它会忽略display: none的节点但会保留visibility: hidden和opacity: 0的节点因为这些节点仍然占用空间。更进阶的考点是script标签放在哪里合适为什么这是因为JavaScript的下载和执行会阻塞DOM解析所以传统做法是把脚本放到/body之前或者给脚本加上defer和async属性。defer是等整个文档解析完成后再执行多个defer脚本按顺序执行async则是下载完立即执行不保证顺序。这一块延伸出来的性能优化题也常在简答题里出现比如减少HTTP请求次数合并JS/CSS文件、使用雪碧图使用CDN加速静态资源分发对图片进行懒加载对首屏做裁剪优化代码层面避免强制同步回流比如不要频繁读取offsetHeight后再写样式前端性能优化的题没有标准答案但思路一定要有一条主线从网络层面减少请求和传输体积从渲染层面减少回流和重绘从代码层面减少不必要的计算和内存占用。答题时按这条主线展开再把具体手段填充进去就能给面试官留下“有体系”的印象。3.2 HTTP协议与缓存机制网络模块几乎是所有前端笔试必考的内容商汤也不例外。这套卷子里有关于HTTP状态码、缓存字段的题还有一个关于GET和POST区别的辨析。乍一看很简单但选项里至少有一两个是“听起来对其实错”的常见误解。比如很多人以为GET请求的URL长度限制是HTTP协议规定的实际上这是浏览器和服务器的限制协议本身并没有规定URL最大长度。“GET比POST安全”这句话也是要打问号的它们都明文传输GET的请求参数放在URL里容易被日志记录但真要加密得靠HTTPS。缓存这块需要掌握强缓存和协商缓存两套机制。强缓存相关的响应头是Cache-Control和Expires浏览器在缓存有效期内不会发请求直接使用本地缓存。协商缓存则要发请求给服务器验证由服务器决定是否使用缓存涉及Last-Modified/If-Modified-Since和ETag/If-None-Match这两对字段。笔试里爱考察的细节是Cache-Control的max-age和Expires同时存在时谁优先答案是Cache-Control。ETag和Last-Modified同时存在时谁优先通常是ETag因为它可以更精确地判断内容是否变化。这些优先级关系要像条件反射一样记在脑子里。另外前端工程师绕不开跨域问题。2018年校招已经很喜欢考跨域的解决方案了比如JSONP、CORS、postMessage、反向代理等。你需要理解的是它们各自的原理和局限JSONP只能发GET请求靠的是script标签不受同源策略限制CORS通过服务器设置响应头来控制跨域访问postMessage一般用于iframe与父页面通信。把这些讲清楚网络题基本就过关了。3.3 前端安全XSS和CSRF的常规考法安全题在笔试里占比不大但几乎每张卷子都会带一两道。商汤这套题里出现了XSS的考查要求选出一个能有效防御XSS攻击的方案。要回答这种题你得先明白XSS跨站脚本攻击的常见分类和攻击路径。反射型XSS通过URL参数注入脚本存储型XSS把恶意脚本存到服务器数据库里每次页面加载都会执行DOM型XSS则完全在前端DOM操作中产生。共同点是不可信的用户输入被当成代码执行了。防御手段的核心就一句话对输入做校验和过滤对输出做编码转义。具体来说比如把script变成lt;scriptgt;或者使用框架自带的模板转义机制。我复习时会把下面这些安全知识点集中背一遍XSS核心是“转义输出”CSRF跨站请求伪造核心是“验证请求来源”常用Token校验、SameSiteCookie属性等方式防御点击劫持通过X-Frame-Options响应头禁止页面被嵌套到iframe中这些内容看起来零散但笔试考查时往往就是结合一个具体场景问你“应该怎么做”。把防御思路讲清楚比记住一大堆攻击代码更有用。4. 编程题实战从算法思路到边界处理4.1 常见的编程题类型与解题框架商汤前端笔试的编程题不会是LeetCode上的Hard难度但也不希望你只写出“能跑通”的代码。我见过不少同学抱怨“我本地跑没问题为什么OJ上就是不给我过”问题大多出在边界情况处理上。从往年经验看这份笔试的编程题可能会涉及数组去重、字符串反转、深拷贝、防抖节流函数实现、简单的排序算法、或者和业务场景结合的题目比如给定一组坐标点判断它们是否构成某个形状。第二类题目往往带点AI或图像处理的味道但本质上还是在考你的编码能力和逻辑组织能力。答题时我的固定套路分三步。第一步确认输入输出格式和边界条件比如输入数组是否可能为空、元素类型是否统一、字符串里会不会包含空格。第二步先写一个暴力解法跑通思路再考虑优化。第三步写代码时把关键逻辑注释出来方便阅卷人理解你的思路。这里要特别提醒一个笔试习惯就算时间不够也要把解题思路写清楚。很多时候编程题阅卷看的不是你AC了多少用例而是你的思考过程是否清晰。在代码里写注释说明你的算法复杂度和边界处理策略有时会比代码本身更得分。4.2 深拷贝、数组去重和函数防抖这些手写题要背熟前端笔试的手写题其实是很固定的几个套路深拷贝、数组去重、防抖、节流、Promise.all、new操作符的实现、instanceof的实现、数组扁平化等。这些不是面试官的恶趣味而是在考察你有没有真正理解语言底层的运行机制。拿深拷贝来说很多人第一版写的是function deepClone(obj) { return JSON.parse(JSON.stringify(obj)); }这个写法能处理许多场景但它有几个明显的坑undefined、函数、Symbol会被忽略Date对象会被转成字符串RegExp对象会变成空对象循环引用会直接报错。笔试里如果考深拷贝通常是要求手写一个能处理循环引用的版本并且能用递归遍历对象和数组。一个更完整的思路是用WeakMap记录已经克隆过的对象遇到循环引用时直接返回之前克隆的结果function deepClone(target, map new WeakMap()) { if (typeof target object target ! null) { let cache map.get(target); if (cache) return cache; let isArray Array.isArray(target); let result isArray ? [] : {}; map.set(target, result); if (isArray) { target.forEach((item, index) { result[index] deepClone(item, map); }); } else { Object.keys(target).forEach(key { result[key] deepClone(target[key], map); }); } return result; } else { return target; } }这段代码是笔试深拷贝题的“标准模板”核心在WeakMap这一行。它能解决循环引用问题而且WeakMap的键是弱引用不会造成内存泄漏。答这种题的时候先把JSON方法的局限性写出来再给出这个版本分数就会明显不一样。数组去重的考法也有好几个层次。最低级的就是Set去重let uniqueArr [...new Set(arr)];但笔试如果只考这个那就太没含金量了。常见引申题是如果数组里有对象怎么根据某个属性去重这个时候Set就不够用了你得用Map或者对象来存储判断依据。这些细节直接决定了你在面试官心中的定位是“会调API”还是“懂原理”。防抖和节流也是常客。防抖是事件触发后延迟执行如果在延迟时间内再次触发就重新计时适合搜索框输入场景节流是固定时间间隔内只执行一次适合滚动和窗口缩放场景。手写实现不难但要注意this指向和事件对象参数的透传function debounce(fn, wait) { let timer null; return function(...args) { clearTimeout(timer); timer setTimeout(() { fn.apply(this, args); }, wait); }; }这里用apply(this, args)是为了保证原函数中this指向触发事件的元素同时把事件对象完整传进去。这两个细节不写代码能跑但不够严谨阅卷人一眼就能看出来你懂不懂原理。4.3 编程题里隐藏的逻辑思维一个“二维矩阵”的变形题有些编程题看着像算法题实际考的是业务抽象能力。比如商汤这类AI公司可能出这样一道题给定一个二维矩阵值为0和1求连通区域的最大面积或者给定一张图片的像素矩阵统计不同颜色的连通块。这道题本质上是在为图像分割做简化版本但前端岗同学不需要懂图像处理只需要把它当作图的连通性问题来解。思路是遍历每一个值为1的格子用深度优先搜索DFS或广度优先搜索BFS去扩展相邻格子同时在遍历时标记已访问避免重复计数。DFS实现起来的代码量更少但要注意递归深度会不会栈溢出BFS需要额外维护一个队列但不会出现递归深度问题。我比较推荐笔试用BFS因为可控性更强代码结构也清晰function maxArea(grid) { let rows grid.length; if (!rows) return 0; let cols grid[0].length; let visited Array.from({ length: rows }, () Array(cols).fill(false)); let maxArea 0; function bfs(i, j) { let queue [[i, j]]; let area 0; visited[i][j] true; let directions [[1,0], [-1,0], [0,1], [0,-1]]; while (queue.length) { let [curI, curJ] queue.shift(); area; for (let [dx, dy] of directions) { let ni curI dx; let nj curJ dy; if (ni 0 ni rows nj 0 nj cols !visited[ni][nj] grid[ni][nj] 1) { visited[ni][nj] true; queue.push([ni, nj]); } } } return area; } for (let i 0; i rows; i) { for (let j 0; j cols; j) { if (grid[i][j] 1 !visited[i][j]) { maxArea Math.max(maxArea, bfs(i, j)); } } } return maxArea; }这段代码有几点要注意一是入队前就要标记visited否则可能重复入队造成死循环二是用数组模拟队列时shift()是O(n)操作数据量大的时候性能会差但笔试环境一般不需要考虑这个级别如果要用更高性能的写法可以维护一个head指针。这种“实现题”想拿高分光写出逻辑还不够要把边界情况和复杂度写清楚才算是有意识地在展现自己的工程素养。5. 综合场景题算法平台与可视化大屏的实战映射5.1 前端在AI公司到底做什么商汤的笔试在基础题之外往往会安排一两道综合性的大题把你放在一个具体业务场景里问你怎么设计技术方案。备考的时候如果不了解AI公司前端的工作重心这种题很容易答偏。以商汤的业务为例前端工程师要支撑的场景大致有四类一是算法平台和训练管理后台这类系统需要展示训练任务状态、图表指标、日志流技术栈上会大量用到表格、表单、可视化图表组件二是数据标注和审核系统这类系统对交互流畅度和大量图片加载性能有很高要求三是对外展示用的Demo和官网需要兼顾视觉效果和加载速度四是内部效率工具比如配置后台、监控面板、报表系统。所以综合场景题大概率会围绕“数据可视化”或“高性能列表”来出。比如给你一个包含几万条数据的列表问你怎么做前端渲染优化。这笔试考的不是某个API而是你愿不愿意主动想到虚拟滚动、分页、懒渲染这些手段并且能说出它们各自适用的场景和局限。5.2 大数据量表格渲染的优化思路高频考点之一就是如何渲染一个海量数据的表格且保持交互流畅。很多同学的思路是分批渲染或者使用现成的表格组件但对底层原理说不上来。想拿高分需要分层次回答。第一层是数据层优化不要在渲染时做复杂计算数据预处理该做的提前做第二层是渲染层优化可以使用requestIdleCallback在浏览器空闲时段进行渲染减少对首屏的阻塞第三层是虚拟滚动只渲染可视区域的DOM元素滚动时动态替换。虚拟滚动的核心是计算总高度撑起滚动条再用transform移动可视区域内容避免频繁操作真实DOM。用一张表格对比常见方案会更好方案核心思路适用场景局限分页每次只渲染一页数据数据量中等、交互简单切页体验割裂前端懒渲染按需渲染屏幕附近的数据首屏加载优化滚动时仍可能卡顿虚拟滚动只渲染可视区域DOM万级以上的长列表实现复杂、需要处理动态高度分批渲染用setTimeout或requestIdleCallback分片渲染初始加载时避免卡顿渲染耗时依然线性增长回答这种题时我的经验是先抛出结论再分析数据量和交互场景最后给出针对性方案。面试官想看的不是你背过虚拟滚动这个名词而是你有没有根据业务规模做技术选型的判断力。5.3 从笔试看前端岗位的成长路径还有一个常见的简答题类型是你怎么理解前端工程化或者你做过哪些性能优化项目。这种题看似开放其实最能拉开差距。有的同学答得特别空只会说“用webpack打包、压缩代码、加CDN”但讲不出具体的量化指标和排查思路。我建议回答这类题时遵循“场景-方案-量化结果”的结构。不要光讲手段要讲清楚当时面对的问题是什么为什么选择这个方案做完之后性能提升了多少用什么指标衡量的。如果你没有真实项目经验哪怕是从开源Demo或者网上案例中拆解过也可以带着分析的态度去讲重点展示你的思考能力。这个能力恰恰是商汤这类AI公司前端笔试想筛选出来的东西——不仅会写页面、会调接口还要能理解业务、理解性能瓶颈、有主动推进问题解决的意识。校招岗位意味着你不会被期待有大量实战经验但你会被期待有很强的学习潜力和严谨的思维方式。6. 复盘与备战建议把这些坑提前踩掉6.1 时间分配与做题顺序笔试时间通常比较紧凑我记得自己当时最紧张的是最后一道编程题——不是因为它难而是因为前面在选择题上纠结太久。吃了几次亏之后我总结了一套做题顺序先快速扫一遍卷子把会做的题标记出来选择题如果卡住超过2分钟就先用排除法圈出两个备选标记后跳到下一题简答题先写关键词和结构回头再补充细节编程题至少留出整场考试40%以上的时间。为什么要留这么多时间给编程题因为编程题的得分是“按点给分”的哪怕你不能完全AC也能通过写对部分逻辑拿分。而且编程题通常需要调试没有充裕的缓冲区很容易自乱阵脚。选择题和简答题的作答策略也有差异选择题更依赖概念的准确性你要有意识地把那些“相似但不等价”的概念区分开比如undefined和null、和、let和var等简答题则更看重结构用“观点解释例子”的格式组织信息条理清晰远比字数多重要。6.2 一定要亲手敲一遍的手写代码题我建议任何一个准备前端校招笔试的人在考试前把这些手写代码至少亲自敲两三遍而不是只在脑子里过深拷贝含循环引用的版本防抖与节流Promise.all与Promise.racenew操作符的实现instanceof的实现数组扁平化与去重手动实现一个简单的事件总线EventEmitter亲手敲的意义在于你会发现很多平时看懂了的问题落到代码层面会有细节想不起来比如new操作符实现时需要判断构造函数有没有显式返回对象比如事件总线的off方法要处理同一个监听函数被多次注册的情况。这些细节只有写完才知道哪里容易漏。有一个好用的自测方式写完一段代码后不要急着看答案先找几个边界输入自己推演一遍输出。比如深拷贝测试时加一个循环引用const obj {}; obj.self obj;如果代码能正常跑完不报错说明你已经具备了基本的工程思维。6.3 建立错误清单比刷题更重要笔试复习后半程我遇到的最大瓶颈不是不会做题而是反复在相同类型的问题上犯错。后来我开始整理一份错误清单把每道错题按照“知识点-错误原因-正确思路”的格式记录。这份清单在冲刺阶段的效率远高于再刷一百道新题。举几个常见的错误类型异步顺序题总是忽略微任务的优先级原型链题总是把prototype和__proto__搞混HTTP缓存题分不清强缓存和协商缓存的触发条件编程题在极端输入下没想到数组长度为0的情况。这些问题并不难但它们在考场的高压环境下特别容易复发。建立错误清单之后我在做题前会先扫一眼清单相当于提前打了个“疫苗”。这个习惯一直维持到现在工作里排查线上问题时我依然会用类似方式记录和归类问题效率比凭记忆乱试高得多。6.4 笔试之外别忘了准备这些笔试和面试通常是连在一起的往往笔试通过后一两天就会收到面试通知。所以不要觉得笔试结束就万事大吉。在准备笔试的同时最好同步把项目经历、实习经历、个人介绍都梳理一遍这些内容面试时必问。前端岗位面试通常会追问项目中的技术难点、性能优化过程、团队协作方式还会让你现场写代码或讲思路。笔试考查的更多是“你会不会”面试考查的则是“你能不能表达出来”。如果你在笔试复习时养成了“每个考点都能用自己的话讲清楚”的习惯面试时就会顺畅很多。另外投递商汤这种AI公司之前最好稍微了解一下他们产品和技术方向。不需要多深入但至少要能说出计算机视觉平台是做什么的、前端在里面的角色是什么。这种了解在面试时很加分因为面试官能感受到你是认真做了功课的而不是海投碰运气。关于这份笔试本身我的整体印象是它并不追求“偏、难、怪”而是老老实实地考了一个前端工程师应该具备的完整知识体系。你不需要会人工智能算法不需要会Python不需要会数据处理但你必须把JavaScript吃透、把浏览器调教明白、把网络协议理解到位。只要基础打扎实系统性复习几轮这套卷子是完全有能力拿高分的。但反过来如果你只熟练某个框架的API而忽略底层它就会变成一面照妖镜让你把所有的薄弱点都暴露出来。
返回列表