经过一周多的时间的面试,工作方面终于是尘埃落定,下面就简单总结一下今年面试的情况和经验。
简历的亮点
简历中的亮点是十分重要的,它直接决定面试官是否有话可问,也直接反应了最近几年我们的工作质量。如果每天都仅仅是完成自己的开发任务,我觉得是远远不够的。
我记得两年之前我的简历亮点是:阅读过XXX框架的源码,但是很多相关的问题在实际面试的时候没有回答出来,导致所谓的“亮点”起到了反作用。
今年的面试,简历里的亮点的主要有这几个,也是受到提问最多的几点:
- 带领团队进行 Code Review
Code Review,这个是确实存在的,只不过没有我回答得那么深,但是也差不了多少。我主要是从三个层面回答这个问题:
对于提交规范的检查,因为很多人喜欢在提交代码的时候,非常随意地把一天写的代码一股脑提交上去,这样在后面定位问题的时候,很难找到我们修改的部分。因此,我们制定了一个规范,就是每次提交的时候,按bug单号提交修改的部分,提交信息包括修改的bug单号、修复的版本号、修改内容。后续有面试官提出,可以写一个Git的钩子,让机器去检查。不过后来我也想过,如果是机器检查,也很难完全查出来规范。
对于代码书写规范的检查,这个一般都是使用
ESLint
工具进行检查,我后面加了一点内容,就是把这个规范放到自动化编译平台上面去,这样每次打包的时候,如果代码不符合规范,就会打包出错。事实上,我的第一家公司就是这么操作的。对于代码文档、注释方面的规范,这个是需要把每个人写的代码投影出来,主要检查一些方法的注释是否规范,一些复杂的业务逻辑是否画了流程图,一些需求文档的地址是否写在README里面,等等。
这个问题我个人觉得自己的发挥还是不错的,算是一个加分项。
负责维护前端组件库
是否是从零开始开发
开发一个公共组件的思路和注意事项
事实上,我不太清楚面试官问的重点和目的在哪
负责招聘面试
- 面试的时候主要关注哪些点
这个只有少部分的面试官问到了这个问题
基础知识的掌握
闭包以及闭包的作用
直到这次面试官问这个问题之前,我都不是很确定这个问题到底要如何回答。这次面试官问了这个问题之后,我又查了一些资料,进行了更深层次的理解,终于有所收获。
关于闭包,网上有一句话值得我深思:如果你觉得一个概念很难理解,那一定是因为你理解错了。
JS有哪些数据类型,如何进行类型判断
这个问题基本上都是必考题或者基础题,一旦出错,基本上就要告别这次面试了。
后来问了一个Object.prototype.toString.call 这个方法判断数据类型的原理是什么,这个打得我措手不及。
为什么数字、字符串可以像对象那样去访问属性或者调用方法?
- 包装对象,貌似《你不知道的JavaScript》中有这个概念
普通函数和箭头函数有什么区别
this指向
后来补充一个,arguments对象
一些代码题
深拷贝和浅拷贝,以及如何实现一个深拷贝
貌似第一场就问到了这个问题,但是当时我没有任何准备,所以惨败。后来仔细地看了相关方案,发现没有我想象中那么简单。其实不仅仅是要解决问题,更是要说好问题出现的原因和解决问题的过程。
例如,我们平时工作中,可能就只是简单地先
stringify
再parse
,就可以解决项目中99.99%的问题,但是作为面试题,不能仅仅这么回答就完了,我们需要一步一步朝着完美方案去靠近。比如,我们之前的方案,一些特殊类型的数据,例如数组、日期,就会在转换的时候就会出问题,为了解决这个问题,我们需要换个思路,比如使用遍历对象的方式,如果待遍历的数据是个对象,就递归调用这个方法,否则,就把这个属性进行赋值操作。其实递归调用一般我们也都能想到,但是还有一个问题就是循环引用,比如对象的一个属性值是这个原始对象本身,我们如果不处理这样的情况,就会出现递归死循环的情况,所以我们需要一个空间,把拷贝过的对象存起来,每次拷贝对象之前,看看这个对象有没有存过,可以使用ES6的Map
或者WeakMap
。其实面试官在问我深拷贝之前,还问了ES6的Map数据结构,没想到这两个问题是有一定联系的。
flat 数组扁平化
这个问题在一次视频面试中被要求现场手写代码,当时也没有看,所以又惨败。
其实实现的思想就是递归,不过也有其他的思路,比如转成字符串,然后把所有的方括号都清除,然后再在左右拼接一个括号,再转成数组。
数组去重的思路
这个问题我有特意准备过,因为之前的公司有一道笔试题就是这个。当时大多数人都写了用ES6的
Set
去进行转换,但是我觉得这应该是个算法题,不是方法题。Set 数据结构
循环数组,把数组push到一个临时数组里,push之前需要判断一下当前数据是否已经存在于临时数组里
循环数组,判断每一项第一次出现的位置是否等于当前的位置,如果不等于,就需要剔除这条数据。
利用对象的key是唯一的这个特性,把数组的每一项都变成一个空对象的key,但是这种方式也有局限性,就是对象的key只能是字符串,因此我们为了解决这个问题,需要去使用ES6的
Map
数据结构,使得其他类型的数据也可以作为Map
的key,并且是唯一的,这样就实现了去重。
CSS 实现子元素相对于父元素水平垂直居中
- 这个也是我平时喜欢问的问题,所以就没有问题。
这一类题目,只能平时慢慢积累了。
常用框架相关
typeof JQuery/Vue/React 分别是什么
这个是我遇到的最特别的问题,通过
JQuery
和Vue
的使用方式,我知道它们的写法是和函数一样的,所以知道这两个是function
,但是React
我不是很确定。根据用法,我们一般都是写React.Component
,所以应该是object
。然后还问了一个
class A{}
,然后typeof A
,我也不是很确定,最终尝试一下,是function
,后来编译了一下class,最后确实是个function
。
双向绑定和单项数据流
其实对这两个的概念我一直都很模糊,直到有个面试官解答了这个问题。
双向绑定和单项数据流,是两个不同的概念。
Vue、React中都有单项数据流,就是改变数据或者调用setState的时候,DOM也会跟着去更新。
双向绑定,拿Vue来说,就是Vue提供了一个语法糖,用
v-model
的写法,使得我们在输入的时候,改变了DOM,同时也改变了数据,本质上,我们可以使用oninput
去监听输入然后进行赋值操作。后来问到如果我们不想用oninput,要怎么做,这个因为平时我对此没有什么了解,所以惨败。
工程化
Webpack相关
webpack里面有哪些接口
如何减小代码压缩的体积
貌似只有最开始的一家公司问了好多关于Webpack的,我完全招架不住。
其他
- 主要讲了一下自动化编译平台里面的一些东西
计算机网络
关于计算机网络,大部分都是第二轮 CTO 或者技术主管的面试会遇到。
HTTP的状态码:304、401代表什么
- 经过一次面试之后,我就把《图解HTTP》简单看了一遍,把一些比较关键的东西记了一下
HTTP缓存有哪些方式,是否了解协商缓存
- 第二轮面试经常会被问到的问题,也会和其他问题关联在一起,比如性能优化的方案,关于缓存,请求头等等
HTTP请求头有哪些
HTTP2.0 相比于 HTTP1.1 做了哪些优化
- 也是图解HTTP里面可以找到的,只不过平时工作不会去注意这方面的东西。
项目部署的更新机制,增量更新,缓存入口等等
- 这些其实都是和平时的工作密不可分的,要充分理解平时的工作内容,就算自己不参与平台的建设,也需要稍微了解一下。
简单总结
面试前的准备很重要,问的东西会比较全面,很多知识可能是盲区,但是也需要去了解一下,不要无话可说。
盲区之所以叫盲区,是因为我们自己意识不到。所以我们可以通过各种各样的面试练习去找到我们的盲区。
基础知识的积累很重要,有些非常底层的东西,如果深入了解,可能会有其他发现。
平时的工作,过程很重要,或许平时我们工作的时候注重的是结果,但是面试的时候,拼的是我们工作的过程。对过程的理解(不是了解),理解平时的一些操作的原因和原理。
心态很重要,我们可能会经历很多挫折,没有人喜欢失败,但是面试总会经历很多失败,有时候甚至会怀疑自己,但这些,都是磨炼,不是折磨,我们要正确面对和认识我们所有的经历,从中获得提高。