登录
  • #中国面经
  • #ByteDance

发个‌‌‌‌‍‍‌‍‌‌‍‍‍‌‌‌‌‍‍‍‌‌‍‍‌‌‌‌‍‌‍‌字节前端一二面

一亩三分地匿名37F
497
3
之前疫情在国内呆了一年多,深感还是离家近好,回美后一直wfh感觉越来越没有意思,正好linkedin上有猎头问,就交流了一下,投了深圳字节抖音的开发岗。在牛客网看了看面经,刷了几天八股就面一面了。

一面

可能记不全,基本八股和手写代码一半一半吧

八股

1. 了解webpack么

基本公司项目都搭好了没什么机会改,不过顺势答了一下commonjs和es6 module在webpack打包的区别,以及tree shaking啥的

2. 了解React Fiber么

正好看过大概说了下react15和16的区别,Fiber的大致结构

3. 了解js事件循环机制么

大概就是宏任务和微任务那些,具体可以看看一些看代码说输出顺序的题

4. 还有一些不太记得了

飞书内手写代码

1. 看题说结果,好像是跟this相关的

2. css相关,说有一个header要顶置,另外一个div,里面的内容需要垂直居中啥的

header用fixed position,然后垂直居中就用flex,不过也没得跑,大概意思了一下

3. 一个数组,里面存的的是函数以及时间timeout,要求实现一个函数把他们按数组里的顺序以及各自的时间执行。好比第一个timeout是1000, 第二是2000,那就要延时1000执行第一个后再延时2000执行第二个。

一开始用reduce串起来了,面试官说能不能用循环的方式,我说那就把timeout放在数组里,setInterval去看有没有达到第一个时间,达到了执行第一个然后出列,下次就看第二个,以此类推。不过面试官好像不太满意,但是时间不多了(面试一小时了)就让我问问题,于是我又多问了20分钟。虽然我一直说呀如果你有要紧事告诉我我就问最后一个,然而问问题这件事上我不能虚。时候想想其实还可以用一个counter把之前的timeout累加起来,加上当前函数的timeout放到setTimeout里,那么按上面的例子,第一个函数timeout是1000,第二个就是1000+2000=3000,这样放循环里应该可以。

12多面完睡觉去了,起床猎头说约二面,当时想着再多看几天就推到下星期了





二面

二面前一晚睡得晚,然后面试前突然犯困,灌了杯咖啡,11点准备开视频猎头说面试官路上堵车可能要晚半个小时,然后我又再喝了一杯咖啡……

二面八股相关的少一点,感觉更多是穿插在项目里。

1. 你觉得理想的前后端是怎样的

我当时一脸懵逼,默默介绍了下公司现在的技术栈。如果现在让我答我估计会说前后端分离,前端聚合多个项目互不影响,还可以扯扯为前端架构;后端解耦,利用微服务把不同业务逻辑分开,然后开发和scale up分离开,工程师专心业务代码,把scale up交给框架啥的。感觉可以说的东西不少。

2. 介绍下最难的项目

真心觉得以前的项目都没有说特别难的地方,更多是和业务逻辑结合的比较棘手的地方。说着说着提到了前端技术栈,redux和redux saga,挖了个坑

3. 说到redux,知道什么是副作用/side effect么,如果处理side effect

当时并不知道具体side effect是啥,后来看了,通俗的讲一个函数除了把输入计算成输出外还做的别的影响到程序的事情,比方说console.log,http这些都是副作用。

4. 你们公司页面的图片是怎么部署到cdn上的

这个我现在都不太了解面试官想问啥,一般说到cdn都是跟dns一起说,解决用户请求第一公里的事,再让我说我估计会说说那些图片文件之类的如何缓存在cdn上的。

5. 好像还问了其他,具体不太记得了。问答环节感觉很虚。

飞书手写代码

1. 写一个多叉树结构,然后写一个函数算出树的高度

基本就是一个node,里面有val和children,children是一个空数组可以存新的node这样。计算高度用了BFS,一个数组存前一轮节点,然后一个数组存之前节点的children,作为下一轮的节点,循环次数就是树的高度。面试官问为啥最后结果就是树的高度,嗯,最远的叶节点和根节点距离不是树高么?

2. 写一个函数,传入一个promise和timeout,如果promise超过一定timeout就自动reject

因为这个函数后面可以跟then/catch所以返回的也应该是个promise。基本上就是把一个setTimeout放到这个新的promise里面执行,大概是这样:

function sth(promise, timeout) {[br][/br][br][/br]  let newPromise = new Promise((resolve, reject) => {[br][/br][br][/br]    setTimeout(() => reject(), timeout);[br][/br][br][/br]    promise.then(data => resolve(data));[br][/br][br][/br]  }[br][/br][br][/br]  return newPromise;[br][/br][br][/br]}
3. 知道防抖吗,具体做啥的,写一个

当时实在是困,说起防抖就想起设setTimeout,然后再执行的时候就把旧的清了再建一个,忘记把闭包加上了,事后才醒悟。按理说应该是这样的:

function debounce(fn, timeout) {
当时没把apply啥的写上,写完面试官也没说啥,然后问能不能用react hooks实现。我当时是一脸懵逼的,不太清楚面试官需要啥,然后他可能看时间不够了就问了下useRef的用法。一小时到了又到了问问题的时间。至少在问问题这个环节,我不弱于人。于是问了20多分钟。

我现在也不知道面试官想用hook实现什么防抖功能,一般可以通过useEffect监听一个经常变化的值,然后延时执行某个特定函数。如果只有一个函数和timeout还真不知道要做啥。

面完那晚咖啡喝太多睡得不好,然后想起面试过程也是各种要挂的感觉,果不其然第二天找猎头问就挂了。Anyway,面试也是越面越熟,多多益善吧。安慰自己还可以换组面。





总之这两年多第一次面试,也是人生第一次面国内公司,确实跟之前不太一样。虽然大家老说八股文很烦,但其实多看几次还是挺好玩的,都是些平时不怎么会看到的知识。至于手写代码环节也是加深对js底层代码实现的理解吧。就是之前还刷了算法好像也没怎么用上有些可惜。看了不少网上的面经,觉得自己跟应届生的知识水平好像并没有太大差距,平时还是要多从业务工作走出去做知识的拓展呀。

补充内容 (2021-10-25 08:08 +8:00):

防抖的代码不知道为啥被吞了,不过网上一搜一大把
3条回复
热度排序

发表回复