面试那些事

1,937 阅读5分钟

面试那些事

面了一圈发现问的问题都是大同小异,区别可能是问的问题深度的不同,在这里记录下,下面会把我觉得比较有意义的面试题罗列出现,目前不会给答案 因为我的答案也不是最完美的,找答案的过程是比较有意义的

刷过的怪

  • 58
  • 奇安信
  • 蚂蚁
  • 作业帮
  • 美菜
  • 好未来
  • 百度
  • 盒马
  • 快手
  • 字节

上面的除了字节没刷过,蚂蚁年限太短之外,其他的基本都过了。

正题

js 基础部分

  • 原型链
  • 作用域链
  • dom 文档模型
  • dom 文档模型的捕获和冒泡
  • 深拷贝
  • 继承(es6、es5都实现一遍,并说区别)
  • 异步(给出 setTimeout、promise 之类的让你说顺序,以及花费的总时间)
  • eventLoop
  • defer 和 async 加载的区别(最好说到 defer 是在 DOMContentLoaded 执行)
  • 给一些数组的题,让你用 array 的 api 来做一些排序之类的(filter、map、reduce等)
  • array push 的返回值
  • 实现 promise all 以及 promise finally
  • promise 实现原理
  • 装饰器
  • async await 实现原理
  • 如何检测对象类型
  • commonjs 和 esmodule 的区别(进而会衍生出 require 和 import 的区别)
  • requestAnimationFrame 实现 setTimeout

css 部分

  • class 权重值计算
  • BFC (进而会衍生出在横向会折叠吗,以及为什么出现 BFC)
  • flex (会问到 flex-grow flex-shrink 的拉伸和压缩系数计算)
  • 实现超出省略
  • 三列布局
  • position (绝对定位之类的)
  • 居中实现
  • 移动端适配
  • display: none 和 visibility: hidden 的区别(进而会衍生出重绘和回流)
  • 重绘和重排
  • 清除浮动

浏览器

  • html 解析过程
  • 渲染卡死的可能原因
  • 如何检查内存泄漏(以及解决方案)
  • 前端路由的实现方案

框架和库

vue
  • 双向绑定的原理实现
  • 为什么组件的 data 需要是一个函数
  • defineProperty 和 Proxy 的区别,以及他们的优缺点
  • vue 什么时候需要设置组件的 name
  • vue 是如何实现的批量更新 dom ,为什么不是每次值更改就去变更 dom (可以讲讲 nextTick 的实现)
  • vue 组件传值的方式
  • computed 如何实现缓存计算的
  • watch 和 computed 的区别以及实现原理
  • eventBus 的原理
  • keep alive 的实现原理
  • vue router 实现的原理(会拿他和 react router 作比较,以及会问他们都是利用什么来实现的)
  • vuex 的原理
  • vue 如何实现插件或者组件注册的
  • 实现发布订阅者
react(react 问的比较少,因为我写的最近一年都在用 vue)
  • react 的心智模型
  • 高阶组件
  • hook
qianduan (微前端相关的,简历里面写了)
  • 用 qiankun 解决了什么
  • qiankun 做了什么
  • qiankun 如何实现沙箱隔离的
  • 为什么不直接用 single-spa

http

  • 强缓存和协商缓存
  • 缓存命中顺序(from cache 、form disk 这些)
  • 控制缓存的头部有哪些以及作用
  • http1.0、http1.1、https、http2.0 的区别
  • http2.0 为什么能实现多路复用
  • http2.0 如何实现头部压缩
  • https 在 tcp 握手过程和 http 的区别
  • tcp 三次握手(会衍生出,第三次握手是否可以携带数据,以及会让你详细说过程)
  • 为什么需要 tcp 三次握手和四次挥手
  • 如何强制更新缓存
  • cookie 和 session
  • cookie 里面 domain 和 path 的作用,以及如何设置过期时间
  • 分布式如何保证 session 一致
  • pwa 和 service worker
  • 跨域(简单请求,复杂请求之类的)

webpack

  • webpack 执行过程
  • loader 和 plugin 的区别
  • plugin 实现原理
  • 打包或者编译优化的经验
  • 和 vite 以及 snowpack 的区别
  • 你是如何做大文件拆分的

前端优化

这个答案其实挺难说的,因为每个人情况不一样,可以把自己知道的说全就行。

code

  • 找出一个数组中连续出现最多的一个或多个数字
  • 给出二叉树子节点找出他们最近的公共父节点
  • 找出一个数组中出现次数最多的一个或多个值
  • 请将数组 [[1,2,4],[1,1,2,1], [1,2,3],[1,3,4],[1,3,2]] 排序成 [[1,2,3],[1,2,4],[1,3,2],[1,3,4],[1,1,2,1]]
  • 实现发布订阅者
  • 实现深拷贝(注意环和symbol的问题)
  • 实现三列布局
  • 现在有一个长度为 10000 的数组,找出数组中出现次数超过一半的值
  • 快排
  • 实现有效括号匹配{}({})() => true{)}{()} => false
  • 实现一个简易的 xml 解析器 <list><item>1</item><item key="2key">2</item></list> => {tag: 'list', children: [{tag: 'item', children: 1}, {tag: 'item', children: 2, props: {key: '2key'}}]}
  • 实现 class 权重值计算函数,用例要通过:
compare('#container > .element', 'body > .element') === 990;
compare('body', '.element') === -90;
compare('.element + .element::last-child', '.element:hover') === 10;
compare('input[type=text]', 'li:hover') === 0;
场景
  • 统计用户在页面的每一次点击,实现方案
  • 虚拟列表实现方案
  • 错误监控实现方案
  • 服务端渲染
  • xss

个人经验

这次面试经历其实是没有准备过的,所以我这边搞了一个方案,先面试自己有把握的比如 58、奇安信、作业帮那些,面试官跟你之间的沟通其实也能给你很大的帮助,一定要会每次面试完后进行复盘,对自己不熟悉的点进行改进以及扩展,第二个就是刷算法题(永远的痛)。