年前又面了一次字节跳动,不过还是凉了。趁着过年,把面经贴上来,供大家参考。
一面(1月22日)
自我介绍
项目
项目有哪些难点
现在在做什么项目,介绍一下
URL输入以后发生了什么
HTML async defer
为什么JS执行的时候要阻塞HTML解析
HTTP2有了解吗
HTTPS有了解吗
TCP UDP的区别
XSS CSRF 有了解吗
事件委托、事件冒泡、事件捕获
手写事件委托
手写发布订阅 EventEmitter
CSS动画了解吗
JS如何实现动画
两个链表找相交节点
cookie和session了解吗,session有哪些存储方式
微信登录怎么实现
小程序的原理
看你写过爬虫,爬虫是怎么写的,数据存在哪里,怎么导出
NodeJS express koa 了解吗
手写事件委托的时候,对浏览器的API还是不够熟悉,思路基本上能想到,但是答案不完全正确。
两个链表找相交节点那道题我用了一个常规的双指针的做法,即每个链表上的指针走到尾以后,自动走到另一个链表的头,如此往复,如果有相交节点的话,两个指针必相遇。但是面试官说这个解法不够好。建议大家刷题的时候还是看看最优解法,我之前刷题的时候是解出来就算过了,看来还是要多下点功夫,更进一步。
二面(1月26日)
自我介绍
聊了很久的项目
setInterval 的细节
Promise 的细节
这次二面是被问及知识点最少的一次,大约三分之二的时间在聊项目,最后一点时间出了两个题。项目部分其实比较好发挥,因为都是自己做过的东西,问了这么多项目的细节可见面试官也是给了我不少机会的。但是最后 setInterval 的执行机制和 Promise 回答得实在有点拉胯,所以这次二面以后还是没了三面。
setInterval 的话面试官是给了几个 case,比如 set 一个 Interval 多少毫秒的,再 set 一个 Timeout 多少毫秒的,重复设置,当中有重叠,问他们的行为。这个题目具体的记不清了,当时也没答对。现在再看这倒题的话其实只要记住,setTimeout 和 setInterval 是在相应的时间把任务添加到任务队列,但不能保证它立即执行。记住这个点应该就能够解决这类问题。
Promise 的话问在一个 if 中,resolve 或者 reject 之后需不需要 return。一开始我觉得是 return 一下更保险的,但是这道题的考点其实是 Promise 的状态一旦变成 fulfilled 或者 rejected 以后,就不能再改变了。手写一遍 Promise 的源码的话其实会知道,resolve 或 reject 在被调用时,前面都有一个判断 if (this.state === "pending"),如果 Promise 的状态不是 pending 的话,Promise 相应的解析值或者错误值就不会被改变。
总结:
比起前面两次,这一次准备得算是比较多了,常规的面经中刷到的题目基本上都准备了。但是面向面经准备也有一个弊端,即知识不够系统。其实几次面试下来,面试官给的反馈都是,知识不够系统。对于在看面经的朋友们,还是建议多看红宝书、精通CSS之类系统性的书籍,对构建知识体系比较有帮助。尤其像前端这种大学里没有开设专门课程,或者开设的课程比较基础比较落后的,在自学的过程中更应该有意识地去搭建知识的系统和网络。