以下是分享我作为面试官的一次前端面试经历。
开始之前先介绍下背景:
岗位要求:中级前端,3~5 年工作经验。
候选人背景:某 985 硕士研究生毕业,3 年经验,期望的薪资在公司算高级前端范畴。
候选人在做自我介绍时对自己的技术水平非常自信,声称看 Vue3 的源码已经看了 90%,React 源码也在研究当中。在我看来能把 Vue3 源码看完并弄懂里面的所有细节绝对是大佬级别,当然面试过度吹嘘的也很多,我想再次确认下: “你确定你看 Vue3的源码看到 90% 么?“。
候选人很自信的回到:“确定!”。
"好的,那我开始问些技术问题",既然是看过 Vue3 源码水平的人,我就不问"基础数据类型"、"原型"、"闭包"、"变量提升"等问题了,直接上强度了。
"这个项目是你独立从 0 到 1 搭建起来的么?"
"是的"
"我看你项目中一个子应用是用 Vue,另一个子应用改为 React,基于你实际项目场景为何技术栈要这么选择。"
"因为 React 的社区生态要比 Vue 的更好些,React 社区更活跃些"
"你这说法有点老套了,React 和 Vue 都已经发布十多年了,Vue 的生态也该成熟了,完全能满足平时开发需求,你说的社区生态差距现在来看不会很大吧!"
"你要这么追问考究的话那几天几夜都说不完了!"
"不是,我是问在你这个项目背景下这么选择的实际理由,基于什么考虑的,即使你说单纯的个人喜好那也是一个理由啊!"
"我明白了你的意思,因为第二个子应用是各种拓扑图,采用的是蚂蚁的拓扑图插件,它是用的是 React"
"也就是因为项目采用的第三方插件使用 React,所有第二个子应用用 React"
"是的"
"好的,我看你项目中用到了微前端框架 qiankun,那我想问下 qiankun 有什么缺点么?"
"我在使用的时候感觉缺点就是 qiankun 的配置有点复杂,而且不支持 vite"
"好的,我看你简历上写了自己实现特殊的虚拟列表,那我想问下你的这个虚拟列表和很多 UI 组件库的虚拟列表有什么区别么?"
"区别就是我实现的虚拟列表竖轴会自动滚。"
"那我想问下滚动分页和虚拟列表有什么区别么?"
"没做过滚动分页不太了解他们的区别"
"好的,我看你简历上写有用到 websocket,封装 websocket 的时候需要考虑哪些方面?"
"我是按例子直接使用的,没做过多的考虑"
"你们 websocket 没有做心跳机制么?"
"项目没有这个需求"
"那有做重连机制么?"
"有,有做最多5次重连"
"好的,你刚刚说看过 Vue3 源码,那我就再问问 Vue3 的吧,Vue2 和 Vue3 有什么区别么?只要说主要区别就好,细的区别就不用说了。"
"主要区别一个是响应式的原理从 vue2 的 defineProperty 改为 Proxy,性能更好而且解决 vue2 中新增属性没有响应式的问题。另一个区别是添加了组合 api,更好的处理代码的复用,解决 mixins 的一些问题,并且代码的可读性更好些。vue3 还对 diff 算法做了些优化性能更好。"
"OK,你刚刚提到 vue3 是用代理的方式实现响应式性能更好,那在一些特殊场景下代理的方式性能反而更差一些你知道是什么场景下么?"
"不知道!"
"好的,vue2 响应式在处理数组上有重写数组的七个内置操作方法,那 vue3 代理的方式处理数组上有重写数组的内置方法么?哪些方法?"
"你这问的也太细了,谁会记得这个细节啊。"
这里我判断他说看 vue3 源码可能就是像读小说一样过了一遍而已;也有可能没看过只是在面试中赌面试官没看过 vue3 源码问不出什么问题;也可能刚好响应式这块他看的不仔细,因此我再问了一个源码的问题。
“好的,那我再问下 vue 的事件绑定是怎么样实现的,vue 的事件绑定分两种:一种是绑定原生事件,第二种是组件自定义事件。”
“绑定原生事件是在编译器中的,这块我没怎么看。”
“自定义事件是.....” 由于他说的自定义事件实现方式我实在没听懂,所以用省略号了。
“自定义事件实现挺简单的,重点在原生事件,做了哪些性能优化的处理。”
“不知道”
“好的,那我再问下组件之间的通讯方式有哪些?” 这里我判断他对 vue3 的源码了解程度没他开始介绍的那样,于是降低难度。
这个问题的回答就不多说了,基本是回答上了,少了一两个平时很少用到的方式。
“好的,你刚刚有说到 provide 和 inject,那他们的缺点是什么呢?”
“这平时很少用到,缺点不知道!”
“好的,nextTick 是用来做什么的?”
“是用来获取视图更新后的状态或更新后的 dom”
“那 vue 为什么要出这个 api 呢?”
“不知道到,平时很少用” 问到这里我感觉需要再降低难度来界定他的水平。
“vuex 核心流程中的主要功能有哪些“
基本回答上来了。
“防抖和节流是什么”
这个回答的虽然没有八股文上的那么简洁,但大概意思回答上了。
“好的,我在想问下变量提升是什么呢?”
这时候选人的心态有点崩了。
“你问了我这么多问题,都快问了一个小时了,那我想考考你的技术水平”
“同学,现在是我在面试你呀”
“我只是觉得你问的问题太偏了,有些平时都没怎么用到,甚至是完全用不到,有必要问的这么偏么?感觉是你在故意刁难我。”
“同学,你有没有发现我问的问题难度在慢慢下降,因为一开始上来你说你看 vue3 的源码看了 90%,所以我对你的定位有点高了,然后一直在降低难度来大概估算你的水平”
“我确实看 vue3 的源码看了 90% 啊,这个面试对我来说无所谓,我敢说以我 vue 的水平我完全可以在任何城市公司立足,我为什么要在这被你刁难问这么偏的问题。”
“同学,我们平时在业务代码中使用的 api 一般工作到 3、4 年就基本都会了,那在往后通过什么依据来对技术能力进行划分呢?你开的期望薪资这么高,然后还要别人只能问平时业务中经常用到的,大部分有经验的都能回答上来的问题,那凭什么会选你呢?而你所谓的偏的问题更能体现你平时有没有在做刻意练习。”