前端面试官速成题库

1,464 阅读9分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

背景

笔者在《如何高效地招聘前端》一文中提到,面试题目的深度要比广度更重要,提问要挖掘候选人的极限,要有层次有梯度。这就对面试官有很高的要求,那么如何快速培训面试官呢?当然是用题库。

本文主要脱胎于笔者这些年面试以及被面试的总结,有疏漏的地方,请多留言指正。

目标

  1. 系统整理常见的前端知识点
  2. 每个知识点列举多个题目,分级,深度递增
  3. 方便面试官学习和使用

正文

分级与工作年限大致对应关系:基础 = 2 年以内;进阶 = 2~4 年;高级 = 4 年以上。

JavaScript

基础进阶高级
- JS 的数据类型有哪些?解释一下“引用数据类型”?
- 判断变量 a 是否为数组(对象)的方法有哪些?复制数组(对象)有哪些方法?
- 什么是类数组?如何转化成数组?
- Array.prototype.pop() 的返回值是什么?对原数组的影响?如何删除数组第 n 项?
- 遍历对象有哪些方法?
- 如何把一个,分割的字符串转成数组?反过来呢?
- 0.1 + 0.2 === 0.3 吗?为什么?怎么解决?
- 后端用 64 位整数作为 id 传到前端会有什么问题?如何解决?
-[] === [] 的结果是什么?== 呢?JS 的 == 的解析过程?
- 实现 Function.prototype.bindArray.prototype.reduce Promise
- JS 的作用域都有哪些?
- 什么是闭包?典型的使用场景?
- new 的过程?
- 什么是原型链?什么是原型对象?Object 的原型对象是什么?
- 实现继承的方式及优缺点?
- 为什么不建议使用object.hasOwnProperty而建议Object.prototype.hasOwnProperty.call
- 什么是 AST?如何应用?
- 单例模式、装饰器模式、代理模式、发布订阅模式、观察者模式的使用场景与实现

HTML & CSS

基础进阶高级
- 什么是盒子模型?
- 列举 5 个行内/块元素
- CSS 的选择器有哪些?优先级如何?
- CSS 单位有哪些?适合的使用场景分别是什么?
- 什么是 rgba?用 HEX 如何等价实现?
- inline-block 的作用及典型应用场景?
- 实现一个元素的水平、垂直居中
- paddingmargin 可以为负值吗?
- position: absolute 元素的偏移量以谁为基准?
- 如何保证文本内容缩进的还原?
- 响应式和自适应的区别及如何实现?
- 什么是边界塌陷?如何解决?什么是 BFC
- flex 有几个参数?意义是什么?
- 如何实现溢出省略(展示省略号)
- 如何实现奇偶数列不同样式?
- 实现列表第一个元素没有上边框或最后一个元素没有下边框
- 伪类与伪元素的区别?::before::after的典型使用场景
- PostCSSScss/SassLess 等预处理器作用?
- 纯 CSS 实现固定宽高比
- 避免 CSS 命名冲突的解决方案有哪些?原理是什么?
- 实现三列布局且中间内容优先加载(HTML 中写在最前)
- serif(衬线)与 sans-serif(非衬线)的区别?font-family 的顺序如何设计?

浏览器

基础进阶高级
- 定义考察:文档流;重绘(repaint)/重排(reflow);DOM/BOM;DOMTree/CSSOM/RenderTree
- 浏览器从接收到 html 后的渲染过程是什么?有什么注意事项?
- Chrome 并发请求有什么限制?
- Cookie,SessionStorage,LocalStorage的区别?以及典型应用场景
- script 标签的 defer/async 属性的区别与作用
- link(style)放在 html 中间会发生什么?
- 图片加载优化措施都有哪些?
- 地址栏长度限制可能引起的问题?如何解决?
- 通常一个浏览器进程(Tab 页签)中都有哪些线程?作用是什么?
- 什么情况下会出现“浏览器阻止新页面打开”的情况?如何解决?
- Event loop、宏/微任务?node 与浏览器环境的不同
- 浏览器的垃圾回收方案,如何避免内存泄漏?

网络

基础进阶高级
- TCP/IP四层(或OSI七层)是什么?HTTP、TCP、IP 分别位于哪一层?
- DNS 的解析过程?常用默认端口号?
- 什么是ajax,浏览器如何实现的?fetch的用法
- 常见的 HTTP headers及作用?get 与 post 的区别?post body一共有几种格式?应用场景分别是什么?
- 常见的 HTTP 状态码及意义?
- 什么是跨域?解决方案有哪些?原理是什么?
- CDN 的作用及原理?
- 三次握手的过程?为什么三次?每一次的作用?
- 四次挥手的过程?为什么要有TIME_WAIT
- 什么是RESTful API?优缺点?还有哪些 method?
- HTTP 2.0的意义及其新特性?
- 什么是SEOSPA模式下如何解决?
- 如何进行手机抓包?
- websocketHTTP之间的关系?
- 1xxHTTP状态码表示什么?在什么场景会出现?
- 如何利用浏览器强缓存优化网页打开速度?原理?如何开启?HTML 文件如何处理?

安全

基础进阶高级
- 什么是XSS攻击?如何解决?前端做还是后端做?
- Cookie的作用及限制?简述SameSite,JWT
- 什么是 CSRF 攻击?如何解决?
- HTTPS 的意义?如何实现?采用的什么加密(对称/非对称)?证书发放过程?如何抓包?
- 简述第三方平台接入的过程及注意事项(如调用微信公众平台的 Open API),或描述从用户请求到接收到反馈的整个时序过程
- 设计一个提供 Open API 的服务,突出重点注意事项

工程化

基础进阶高级
- 介绍熟悉的打包工具(webpack、rollup、parcel、gulp、vite)及优缺点
- yarn 的优缺点?
- 什么是tree-shaking?开发时需要注意什么?
- CJSESM区别
- 什么是代码混淆?作用是什么?
- package-lock.jsonyarn.lock的作用?何时会更改?是否要上传到远端?
- 如何拆分出基本不变的代码?如何实现懒加载?
- babel转译 ES6+ 的原理是什么?AST是否有其他应用?
- 常见的lint标准有哪些?优缺点?huskylint-staged分别解决什么问题?
- 如何强制保证团队 nodejs 版本统一?
- monorepo vs multirepolerna的用法及能解决的问题?
- 什么是CI/CD?解决什么问题?常见的工具框架?token 等秘钥信息如何存放?
- 什么是unit test,e2e test?解决什么问题?常见的工具框架?优缺点?
- 如何设计一套埋点系统?如何计算首屏渲染时间?如何实现异常上报?

项目实践 - React

基础进阶高级
- 常见的hooks及基本用法?与生命周期的对应关系?优缺点?为什么不能在 if 中出现?
- 什么是 Virtual DOM?为了解决什么问题?与真实 DOM 的区别?
- ReduxMobxuseContext等熟悉的状态管理工具的介绍及特点?
- 如何理解单向数据流?为何这样设计?
- 如何理解immutable?为什么?如何实现?
- setState是同步还是异步?为什么?
- useCallbackuseMemo的典型使用场景及注意事项
- 简述React diff算法?时间复杂度是多少?如何做到的?
- React Fiber是什么?要解决什么问题?是递归还是迭代?对 diff 算法有什么影响?
- 比较HOCrender propsHooks的优缺点

项目实践 - Vue

基础进阶高级
- 简述MVCMVVM
- 常见 Vue 的生命周期及使用场景
- @,:,# 分别是什么的简写?v-bind="obj"的意义?
- computed的作用及原理
- style 中scopedmodule解决样式命名冲突的原理?
- Vue 如何实现的响应式?definePropertyProxy
- Vue3 中如何使用 TS?Vue3 与 Vue2 的对比
- 为什么 SFC 中 data 必须是一个函数?props 中引用类型的默认值也要求是个函数?
- Vue diff 与 React 的不同
- template的解析原理?

其他

TypeScript

  • TS 的数据类型有哪些?TS 的作用及优缺点
  • interfacetype 的区别
  • enum 的使用场景?如何从 1(非 0)开始累加?
  • 如何声明一个 key 为 string,value 为 number 的对象?
  • 介绍 TS 泛型,举几个常见的例子
  • PickOmitExcludeRequiredPartialkeyoftypeof等用途?
  • ?!??as的作用?
  • 如何声明一个类?举一个多态的例子

Git

  • 常见的 Git 工具?及优缺点
  • 常见 Git 命令及作用,如何实现缩写,如 git status => git st
  • resetcherry-pickrebasereflog--amend--no-verify等命令的作用
  • 如何重命名本地分支?如何删除远程分支?
  • add => commit => push过程发生了什么?
  • 介绍熟悉的 git 协作规范(如 gitflow)?解决什么问题?如何落地?

跨平台

  • 如何适配不同大小屏幕
  • 移动端如何禁止缩放、禁止用户选择文本?
  • 如何实现双击、多触点操作?
  • 如何实现 1px border?
  • HybridRN/WeexFlutter的比较及原理
  • 常见的跨平台框架优缺点,及实现跨平台的原理

国际化

  • 国际化常用工具
  • 国际化标识放在请求的哪里?用的什么规范?
  • 如何处理单复数
  • 如何处理组件库国际化
  • 如何处理日期、时区国际化
  • 如何处理因国际化导致的样式变化

结语

正如《如何高效地招聘前端》中提到的:

我们要捋清楚一个逻辑,所有知识点都是为了解决实际问题而出现的,实际问题结合了特定场景是可以很复杂的。我们要做的就是从知识点出发,顺着那条“经常被忽略的”长长的线,找到它要解决的实际问题,然后再引申出其他相关知识点,再反复。理论上,可以无限的问下去。

理论上来说,要想真正充分发挥题库的作用,一定是对题库中所有的题都已经烂熟于胸,使用时才能够游刃有余。比如《高效》一文中举的几个例子,一个问题可以从“JS数据类型”一直问到“React 的单向数据流和 diff 算法”,如何让中间的过渡平滑,不那么生硬,是十分考验面试官的水平的。毕竟“自己有千斤力,才能四两拨千斤”。

本文只是对知识点的简单分级,而且并不能够保证足够的严谨和准确性。但是以此题库为基础,在学习、研究上述问题的过程中,一定会有额外的收获,这个绝对是因人而异了。如果以此文为起点,能够快速完善面试官的广度与深度,孵化出一批“游刃有余”的成熟面试官,那也算是功德一件。

夫学须静也,才须学也,非学无以广才,非志无以成学。——《诫子书》诸葛亮

虽天才隽朗,而实须坟诰以广知。——《抱朴子》葛洪

参考文献