经过了半年的思考,加上一个触发的契机,终于下定决心准备跳槽了。9月下旬开始准备,国庆回来开始面试,经历了煎熬与等待,终于在10月底,收获了阿里的offer,然后11月初,又拿到了头条的offer,算是在进入寒冬前,为自己做好了保暖工作吧。
我面的不多,先后就面了阿里、猿题库、360奇舞团、头条。拿到offer之后,就没有再面了。总的给我的感觉是大厂会更加看中开发人员对业务的理解力,而猿题库则会更加注重算法(当然,这应该是早就知道的,只不过没面过没有那么深的体会)。而且,面试的成功与否可能还取决于你之前的项目背景,是否与面试部门的业务相契合。
一、说几个重点
(1)简历上写的基本都会被问到,所以写简历很关键,需要写自己比较熟悉的项目并且突出有亮点的东西。
(2)面试其实就是以后一起共事的同事和你提前进行沟通,所以也是考察自己的沟通能力,需要对自己做过的项目有一定的业务上的理解。
(3)每次面试之后,一定要进行总结,说不定一面问过的你不会的问题三面又会问一遍!
(4)找到自己的一个亮点,通过自己的思考进行系统的梳理,在面试的时候,把涵盖的点都覆盖一遍,会对面试有加分。比如我的简历上写了 React 性能优化,这其实是一个雷点,因为性能优化涵盖的范围很广,只是说一个部分一小点的话,就不会有太好的印象,但是如果能从整体的几个方面进行划分,脑中有一张思维导图,然后再结合自己工作的实践,那么,就会离成功更近一步。请参考我的文章:一张Web性能优化参考图。
二、回顾一下自己的面试准备
(1)首先是准备简历,我会针对所投部门的岗位要求来整理自己的简历,后续就可以有针对性进行相应的补习,比如性能优化、前端安全问题;
(2)制定前端知识点复习要点,个个击破(在文章最后有 ⬇️);
(3)刷面经,平常收藏了好多面经,有序的刷了刷,比较推荐 前端 100 问:能搞懂 80% 的请把简历给我;
(4)因为我做过的项目基本上都是 React 相关技术栈的,因此又会针对 React 知识点进行对应的复习:怎样学习React?当然是自己动手实现一个React啦、2019年17道高频React面试题及详解;
(5)leetcode 刷题是必备的,但是光按照 leetcode 上的题目来刷,我感觉效率是相对来说有点低的,而且真的很需要毅力,直到我看到这篇文章:前端该如何准备数据结构和算法?,然后刷题是在 LeetCode 探索 平台,这个平台将题目进行了卡片式归类划分,对于算法的理解或是记忆都会有很好的帮助。
三、感悟
其实第一次跳槽,是很忐忑的,因为未来会有很多的不确定性。当你熟悉了当前的一种工作以及生活模式,熟悉了一起共事的团队小伙伴,要换到另一种全新的未知的环境,是很需要勇气的,需要逃离舒适圈,逼着自己去重新适应的勇气。但是,人生就是一列火车,每一站都会有不同的风景,努力向前吧💪。
在这个过程中,也见识到了头条小伙伴的年轻活力,真诚与热情,沟通之后,收获了很多。有舍会有得,没有一次选择是绝对的,每一条路都会有自己独特的风景。
四、干货推荐
李兵老师的《浏览器工作原理与实践》,必须要墙裂推荐下,也是我面试期间学习的一门课程,收获了很多。
五、前端知识点复习大作战
JavaScript基础
- 对象创建,new,this,闭包,作用域,执行上下文等
- 继承、原型链、JS执行原理
- 事件流
- 异步回调(Promise、Asnyc/Await)
- event loop
- 垃圾回收
- 正则:match、exec、test
CSS基础
- BFC
- 层叠上下文
- 绝对定位
- 盒模型
- flex
- grid
React技术栈
- React实现原理,diff 算法,虚拟DOM
- 生命周期
- Redux
- 异步请求选型:redux-saga、redux-thunk
前端工程化
- 前端部署
- Webpack:tree-shaking
- 前端路由:hash、history
网络相关
- 缓存:我只是想弄懂缓存而已~
- http/https
- 浏览器机制:从浏览器输入url到按下回车,发生了什么?
数据结构和算法
- leetcode刷题
- 数组和字符串
- 递归
- 排序算法
性能优化
- 加载优化——利用webpack优化web性能
- 渲染优化
- react 优化
前端安全
- 浏览器为什么有同源策略?
- 解决过哪些安全问题?
- 跨域:JSONP、CORS、PostMessage
- cookie/session/token
项目梳理
- websoket、即时通信要点
- 富文本编辑器
- 用过的设计模式(不给自己挖坑,简历上没写)
- 解决的难题、遇到的坑
- 性能优化点总结
手写代码
- 函数节流和防抖
- 浅比较和深比较 vs 深拷贝和浅拷贝:如何写出一个惊艳面试官的深拷贝?
- 手写promise
- bind、call、apply
- JSONP
- 数组降维
- 继承
...
六、面试问题回顾
1)自我介绍:每一面都会有自我介绍,需要提前对自己的简历熟悉一遍。
2)项目重点问答。
3)问答题:
- React 性能优化
-
PureComponent
机制、shouldComponentUpdate
比较的值 - 浅比较和深比较的区别
- 长列表滚动优化机制
- 浏览器渲染流程,下载css和js会阻塞么,页面会如何显示?
- js 脚本中加上 defer 和 async 区别
- NaN类型判断
- 为什么要用 Redux,它的作用是啥?
- 前端安全:用过 postMessage,有考虑安全问题么?还知道哪些安全问题和对策?
- es6相关:为什么要有 Set 和 Map,Symbol 取值
-
localStorage
内存分配 - Webpack 中 tree-shaking 有用过吗?
- 说说 setTimeout、Promise、Async/Await 的区别
- 总结下自身的优势和不足
- 你认为你工作中做的最深入的点是什么?
4)简答题:
- 考察 Event Loop
- 考察 React 渲染
- 考察原型链,Function 跟 Object 的关系
- 考察 this 指向
5)手写算法题(其实不一定要写全,说出大致思路就可以了):
- 节流实现
- 如何实现一个深比较
-
new
实现 -
Promise.all
实现 - 用
setTimeout
实现setInterval
-
arr.reduce
实现 - 数组求交并补
- 斐波那契数列
- 二叉树子节点路径求和
- JSONP实现
6)其它:
CSS 问题 360 问的比较多,其他的也会让实现一些经典布局,不多。
头条Leader面还给了一道思考题,类似于数学上的推理,挺有意思的。